相较于Swift 2.2 , Swift 3做了很大的改动,逐渐脱离OC的影子。
语法上很多对象去掉了NS开头,去掉了繁琐的命名。如 UIColor.redColor() 改为 UIColor.red , 变成了属性,还有方法的第一个参数如果不指定 _调用的时候也要写参数名等等...
本文主要讨论Swift 3中的一些坑和使用过程中的一些小技巧,排名无理由~~
AnyObject 、Any
之前整个项目基本只用 AnyObject 代表大多数实例,基本也不和Any有什么交集。因为Swift 2 针对Int、String 等结构体进行了转换,编译器会自动桥接为NSNumber和NSString这种对象类型 ,在swift3中AnyObject不能表示结构体了 。而 Any 可以代表 struct 、 class 、 func 等几乎所有类型。
fileprivate
在原有的swift中的private其实并不是真正的私有,如果一个变量定义为private,在同一个文件中的其他类依然是可以访问到的。这个场景在使用extension的时候很明显。
class User {
private var name = "private"
}
extension User{
var accessPrivate: String {
return name
}
}
这样带来了两个问题:
- 当我们标记为private时,意为真的私有还是文件内可共享呢?
- 当我们如果意图为真正的私有时,必须保证这个类或者结构体在一个单独的文件里。否则可能同文件里其他的代码访问到。
由此,在swift 3中,新增加了一个 fileprivate来显式的表明,这个元素的访问权限为文件内私有。过去的private对应现在的fileprivate。现在的private则是真正的私有,离开了这个类或者结构体的作用域外面就无法访问。
不再有CGRectMake,CGSizeMake等常用函数了
UIView(frame: CGRectMake(0, 0, 48, 48))
被改为
UIView(frame: CGRect(x: 0, y: 0, width: 48, height: 48))
// 'CGRectMake' is unavailable in Swift
// let frame = CGRect(0, 20, view.bounds.width, 130)
// Swift 3.0 不再有CGRectMake,CGSizeMake等常用函数了
let frame = CGRect(x: 0, y: 20, width: view.bounds.width, height: 130)