1、@escaping(逃逸闭包)
如果一个闭包被作为一个参数传递给一个函数,并且在函数return之后才被唤起执行,那么这个闭包是逃逸闭包。并且这个闭包的参数是可以“逃出”这个函数体外的。
在swift3.0之后闭包默认是不可逃逸的,逃逸闭包需要使用@escaping属性标记。默认不可逃逸闭包 最明显的好处就是:编译器优化你的代码的性能和能力。如果编译器知道这个闭包是不可逃逸的,它可以关注内存管理的关键细节。而且你可以在不可逃逸闭包里放心的使用self关键字,因为这个闭包总是在函数return之前执行,你不需要去使用一个弱引用去引用self
就是在使用该闭包之前如果该函数已经结束调用 就需要在函数参数中添加@escaping
2、block
typealiasFKBlock1 = () -> ()
typealiasFKBlock2 = (_:Any) -> ()
3、as、as!、as?
as:有保证的转换,从派生类转换为基类的向上转型(upcasts)
使用场合:
从派生类转换为基类,向上转型(upcasts)
class Animal {}
class Cat: Animal {}
let cat = Cat()
let animal = cat as Animal
消除二义性,数值类型转换
let num1 = 42 as CGFloat
let num2 = 42 as Int
let num3 = 42.5 as Int
let num4 = (42/2) as Double
switch 语句中进行模式匹配
如果不知道一个对象是什么类型,你可以通过switch语法检测它的类型,并且尝试在不同的情况下使用对应的类型进行相应的处理。
switch animal {
case let cat as Cat:
print("如果是Cat类型对象,则做相应处理")
case let dog as Dog:
print("如果是Dog类型对象,则做相应处理")
default: break
}
as!:向下转型(Downcasting)时使用。由于是强制类型转换,如果转换失败会报 runtime 运行错误。
as? 和 as! 操作符的转换规则完全一样。但 as? 如果转换不成功的时候便会返回一个 nil 对象。成功的话返回可选类型值。
4、willset didset
varname:String?{
willSet{
NSLog("==========")
}
didSet{
NSLog("did set "+name!)
}
}
5、lazy 延时加载 懒加载属性
延时加载或者说延时初始化是很常用的优化方法,在构建和生成新的对象的时候,内存分配会在运行时耗费不少时间,如果有一些对象的属性和内容非常复杂的话,这个时间更是不可忽略。另外,有些情况下我们并不会立即用到一个对象的所有属性,而默认情况下初始化时,那些在特定环境下不被使用的存储属性,也一样要被初始化和赋值,也是一种浪费。
我们在使用 lazy 作为属性修饰符时,只能声明属性是变量。另外我们需要显式地指定属性类型,并使用一个可以对这个属性进行赋值的语句来在首次访问属性时运行。如果我们多次访问这个实例的str 属性的话,可以看到只有一次输出。在首次访问的时候才会调用
lazy var titleLabel:UILabel = {
let label =UILabel();
// 只在首次访问输出
returnlabel;
}()