Xcode8和swift3更新后的注意事项

private和fileprivate

自动转换代码以后把我大部分(不知道是不是全部,没统计)private都改成了fileprivate。本来不用private也不会对程序的编译运行有任何影响,private只是为了保证代码外部可读性而准备的,而现在有了fileprivate以后,private变得更加“私有”。现在的private方法和对象,只能在大括号中访问,即便是这个类的extension中,也不能访问private。而fileprivate的作用域,则和以前的private一样,顾名思义,在这个文件中都能访问。

NSData和Data

Data是swift的产物,和Array,Dictionary,Set等类似。NSData的初始化是NSData(XXX),而Data用起来更方便,在需要获取数据的对象后面加上.data,即可获得数据,方便是方便,老代码的修改就比较麻烦了。

NSURLSession和URLSession

URLRequest终于把烦人的Mutable去掉了,那些强迫症不用再因为let xxx = NSMutableXXX是可变的而纠结了。

Any和AnyObject

现在Any貌似可以和AnyObject互相转换了,以前Any对应struct而AnyObject对应class,一些不太复杂的模型用struct编写,和某些方法(参数需要传AnyObject或者class类型的数据)兼容性不好,不得不改为用class编写,这就不符合struct设计的初衷了。

闭包的escaping和non-escaping类型

这个类型决定了闭包是否在调用他的函数(或其他)返回时就销毁(?),escaping是不销毁的意思,non-escaping是保留的意思。一般在网络方法中,闭包一般在其他线程中执行,并且在函数返回时还没有执行完毕,这里种情况应该使用escaping类型。使用方法是在闭包前面加@escaping。反之同理。
那么为什么在swift2之前都不需要加呢,因为swift2之前默认都是escaping类型,而swift3以后默认是non-escaping。在合理的情况下,使用non-escaping类型的闭包更节省内存,而且,在闭包内可以不用再加self关键字了。
参考文章

awakeFromNib方法中获取frame

原来在xib文件中设置约束定宽高约束,在awakeFromNib方法中是可以直接获取到view.frame.size的值的,现在可能因为xib文件中加入了多设备的尺寸设置,已经不能再获取size了。原来frame还跟xib的实际大小有关,现在xib所有的布局都是相对的了,不能再过分依赖frame。顺带说一下,现在如果直接获取size,得到的是(1000.0, 1000.0)。

plist中的privacy key

在iOS旧版本中都会,凡是涉及到隐私相关权限(例如录音、摄像之类的)的访问,都会提示是否允许访问。在plist有一系列privacy - XXXDescription的key作为权限询问提示的文字,旧版iOS中这些是选填的,iOS10里面如果没有填写又访问了相关权限,程序会崩溃。

形如"\(XXX)"在字符串中引用其他对象

在之前的版本中,只有当XXX的类型是optional?,打印结果才会带有"optional",例如:

var XXX: Int? = 1
print("XXX的结果为:\(XXX))  //XXX的结果为:optional(1)

但如果XXX类型为optional!,就不会打印"optional"。
在新版本中,无论类型为!还是?,打印结果都会带有optional,可以在打印时加上!,或者声明时不要声明为optional解决。例如:

//错误示范:
var XXX: Int! = 1
print("XXX的结果为:\(XXX))  //XXX的结果为:optional(1)
//正确示范:
var XXX: Int! = 1
print("XXX的结果为:\(XXX!))  //XXX的结果为:1
//或者
var XXX: Int = 1
print("XXX的结果为:\(XXX))  //XXX的结果为:1

你可能感兴趣的:(Xcode8和swift3更新后的注意事项)