提示:将代码从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/