长期更新,记录从Swift2.3迁移到Swift3.0苹果公司给的大坑。
中秋节第二天,打开电脑,马丹,Xcode
竟然自动更新了!!!(掀)(╯°Д°)╯ ┻━┻
又不想降回7.0版本,懒ㄟ(▔▽▔)ㄏ
只能凑合着先用着,听说Swift
升级到了3.0版本,这就是本大人不想升级Xcode
的原因,大家都懂,苹果公司更新的新东西永远伴随着各种坑,填都填不完的坑......
┬─┬ ノ( ' - 'ノ) (摆好摆好)
(再踏马掀一次) (╯°Д°)╯ ┻━┻
我觉得我说上面的话都说早了。
开始介绍一下Swift2.3
版本升级到Swift3.0
版本的我遇到的各种坑,如果我能解决,我尽量解决,如果我解决不了,查查资料解决,查资料也还解决不了,就请集思广益吧。
┻━┻╰(‵□′)╯ ┻━┻ 魂淡
1. 官方API出现歧义:ambiguous use of
之前项目中需要用到类似于QQ、微信的照片选择的东西,自己用Photos
框架手写了一个,这一更新就出现问题了。
Photos
中获取到相册PHAssetCollection
之后要去拿这个相册下对应的所有的相片资源,拿到相片资源PHFetchResult
后使用这个官方类中自带的快速枚举的方法找到我要的相片资源,
open func enumerateObjects(_ block: @escaping (ObjectType, Int, UnsafeMutablePointer<ObjCBool>) -> Swift.Void)
这个就是那货在Swift3.0
中的样子
关键是这货还有两个兄弟,这三兄弟达成的功能是一样的,只是参数不同,于是奇葩的一幕出现的,我写上上面的那个方法就会会报一个方法不明确的错误:
这个问题已经解决,见下方更新。
9月16日 22:01 更新:
找到一个不算是解决办法的解决办法,比较笨:
将Swift
的闭包单写成一个常量,将这个常量作为值传入官方API的参数位置。
9月16日 23:14 更新:
之前的方法对于同步快速枚举类的闭包参数不适用。
9月16日 23:19 更新:
真是极坑的,官方的API如果是闭包作为参数,自动生成的大括号外面是不带小括号的,得手动加,否则就回报这个错误,写这个的人484脑残! (╯°Д°)╯ ┻━┻
目前已知,使用SDWebImage的带有completed闭包参数的方法时会出现同样的问题,但是上述解决办法尚无法解决,持续查找原因中。
2.快速注释挂了
查了查据说原因是这个:
这个是因为苹果解决xcode ghost。把插件屏蔽了。
但是快速注释不是苹果官方的快捷方式么?跟插件有毛线的关系?难道是屏蔽的范围没控制好?关于插件的说明可以看第五点。
解决方法那个网页上也给了:
命令运行: sudo /usr/libexec/xpccachectl
然后必须重启电脑后生效
我现在去测一下。
好的,我测完回来了,上面的命令是可行的。
3.非官方Objective-C的第三方库手动添加的不识别:
之前的项目要用到一个非官方的、Objective-C
写的第三方库,现在升级到Swift3.0
之后竟然不识别了!!!
9月16日 22:03 更新:
找到一个解决办法,只是解决办法,具体原因还不知道:
报错的是工程下面的一个Test
,删掉那个Test
就好了,反正基本上也不用官方提供的测试机制去测App,没有什么大的影响。
原因还在查找中,如果有更好的解决办法请告知,感激不尽。
3.NSNumber的类型转换
NSNumber
不再支持转换为NSInteger
类型,但是可以转为Int
类型,等同于NSInteger
类型。
4.访问相册权限NSPhotoLibraryUsageDescription
iOS10新增了对相册权限的限制,需要在info.plist
文件中新增字段NSPhotoLibraryUsageDescription
,值为string
类型,值的内容为提示用户授权时要显示给用户看的信息。
5.不允许使用任何插件
也就是说牛逼的Alcatraz
将不可以使用了,刚开始还没注意,写方法的时候加注释,习惯上的写三个斜杠竟然没有跳出多行注释,才注意到原来Xcode8
已经不允许使用第三方插件了,感觉大苹果对于Xcode的安全性矫枉过正了。
不过禁掉了插件肯定会引起众多码农的不满,也许就没有程序员陪它玩了,于是苹果推出了看起来很高大上的Xcode Source Editor Extension
。而且还能上架Mac App Store
,还能设置付费......
然并卵,官方提供开发的API简单的要死,除了转换一下输入的代码真心的想不起来还能干啥。