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 | //新建项目的 |
原来新版SDK中第一个参数前面现在增加了一个_。这样两个函数的签名就不同了。
所以系统认为旧版的方法不再是delegate中定义的方法了。把delegate方法全部替换后,再次运行代码,界面终于出来了。
Swift2 到 Swift3 SDK有了很大的变化:
- 函数第一个参数必须有标签,旧版默认是没有标签的。所以一些delegate的签名发生了变化。常用的UITableView、UITextField和UICollectView.
- Enum的值的第一个字母由大写改为小写。
- 一些函数改成了属性:如mainScreen()改为main。