局部 scopeC 系语言中在方法内部我们是可以任意添加成对的大括号 {} 来限定代码的作用范围的。两个好处,首先是超过作用域后里面的临时变量就将失效,这不仅使方法内的命名更加容易,也使得那些不被需要的引用的回收提前进行了,可以稍微提高一些代码的效率;
Swift 中,直接使用大括号的写法是不支持的,因为这和闭包的定义产生了冲突。如果我们想类似地使用局部 scope 来分隔代码的话,一个不错的选择是定义一个接受 ()->() 作为函数的全局方法,然后执行它:
func local(_ closure: ()->()) {
Swift 2.0 为了处理异常,Apple 加入了 do 关键字来作为捕获异常的作用域。这一功能恰好为我们提供了一个完美的局部作用域,现在我们可以简单地使用 do 来分隔代码了:
do {
}
在 OC 中一个技巧是使用 GNU C 的声明扩展来在限制局部作用域的时候同时进行赋值,运用得当的话,可以使代码更加紧凑和整洁。在 OC 中可以写为:
self.titleLabel = ({
UILabel *label = [[UILabel alloc]
label;
});
Swift 里当然没有 GNU C 的扩展,但是使用匿名的闭包的话,写出类似的代码也不是难事:
let titleLabel: UILabel = {
let label = UILabel(frame: CGRect(x: 150, y: 30, width: 200, height: 40))
return label
}()