提示:将代码从Swift 3升级到Swift 4?
在转换代码之前执行此操作
提示#1
如果您的viewcontroller符合任何协议,则必须将其与类定义一起声明,以便Xcode可以将协议方法转换为相应的swift版本。
例如,我们可以直接从Storyboard分配UITableView / UICollectionView Delegate和Datasource,通常不在类定义中声明它,而直接编写协议方法,其他委托如UISearchBar,UITextView或UITextField就是这种情况。
只要确保您的ViewController包含声明
例如
MyViewController类:UIViewController,UITableViewDelegate,UITableViewDataSource
为什么要这样做?
Xcode可能不会将已经实现的方法定义转换为最新的方法定义,因为它可能会将其视为您的本地函数。 您需要通知Xcode您的ViewController符合协议XYZ,因此Xcode也会更新您的方法定义,或者至少会给您相应的警告或错误
结果呢?
如果您没有在UnitTesting中涵盖所有代码,或者尚未实现UITesting来彻底测试应用程序,则很有可能在进行手动测试时会丢失部分代码。 这可能会导致崩溃或不当行为。
这也将确保Swift的未来版本在进行转换时会自动转换您的委托方法。
更好的方法(如果您仍然不遵循)
始终为协议实现创建类的扩展
例如
扩展MyViewController:UICollectionViewDelegate,UICollectionViewDataSource {
func numberOfSections(在collectionView:UICollectionView中)-> Int {
返回1
}
func collectionView(_ collectionView:UICollectionView,numberOfItemsInSection部分:Int)-> Int {
返回10
}
func collectionView(_ collectionView:UICollectionView,cellForItemAt indexPath:IndexPath)-> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier:“ reuseIdentifier”,用于:indexPath)
返回单元
}
func collectionView(_ collectionView:UICollectionView,didSelectItemAt indexPath:IndexPath){
}
提示2
如果您的代码是Swift和Objective-C的混合体,则Swift 4要求您显式声明应在Objective-C代码中使用的swift方法和属性。 这是通过在属性或方法之前写一个关键字@objc来完成的。 这个概念称为@objc推论,应该减小构建大小。 您可以在此处了解更多信息:
苹果/迅捷进化
swift-evolution –保留了对Swift编程语言进行更改和用户可见的增强的建议。 github.com
为了轻松找出需要添加@objc标志的代码行,您要做的就是转到构建设置并搜索“ Swift 3 @objc Inference”,将值设置为“ Default”。 它将在所有需要放置@objc文字的地方抛出错误。 只需在方法或属性之前添加@objc即可。 如果您不执行上述操作,Xcode可能会发出警告,但是您可能已经有很多警告,尤其是由于第三方库尚未迁移到Swift4。 因此,将@objc推理警告转换为错误将很方便。
PS Swift 4与Swift 2中的Swift 3相比,变化不大,因此,如果Xcode尚未更改代码,您将在警告和错误方面有足够的信息来了解有关更改代码的位置。 其中大部分将涉及字符串操作,例如Substring等。
这是官方迁移指南:
https://swift.org/migration-guide-swift4/