Swift2 到 Swift3 SDK中协议定义发生改变

Swift2 迁移到 Swift3中协议改变的坑

最近升级到了Xcode8.0。所以把项目代码从Swift2.0升级到了3.0。

没有采用自动转换, 而是根据提示进行了手动修改, 顺便熟悉下代码中的变化部分。

经过不断努力,代码终于编译通过了, 但是运行后,启动界面消失后,界面全黑。

1
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool

函数中下断点,发现启动后程序根本没调用改函数。

新建一个项目SingleView项目,运行后运行正常,删除Main.Storyboard后,手动生成UIViewController,运行正常。

看来不是Xcode的问题,照理说Apple公司也不会犯这么低级的错误。

然后手动把代码copy到新项目中,对项目进行配置,然后,运行,还是黑屏幕。

上面函数中的断点仍然没有激活。

仔细对比新建的项目的AppDelegate.swift和我的项目中的AppDelegate.swift,终于发现了些许不同

1
2
3
4
//新建项目的
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
//旧项目的
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool

原来新版SDK中第一个参数前面现在增加了一个_。这样两个函数的签名就不同了。

所以系统认为旧版的方法不再是delegate中定义的方法了。把delegate方法全部替换后,再次运行代码,界面终于出来了。

Swift2 到 Swift3 SDK有了很大的变化:

  • 函数第一个参数必须有标签,旧版默认是没有标签的。所以一些delegate的签名发生了变化。常用的UITableView、UITextField和UICollectView.
  • Enum的值的第一个字母由大写改为小写。
  • 一些函数改成了属性:如mainScreen()改为main。