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