Swift 之属性篇

Swift Feb 13, 2020

Swift 中的属性和在 ObjC 中有所不同,具体表如下:

消除了诸如: atomic, nonatomic, readonly, weak, strong, assign, setter, getter, nullable, nonnull 等修饰符,但这些特性并未消失,而是通过其他途径简化这些特性对开发者带来的输入量。

内存管理 weak/strong/assign

取而代之的是 Swift 用自动内存管理取代了 weak, strong, assign

类等引用类型的变量,一律为 strong 类型,并且 Swift 自身摈除了循环引用的问题,省略了 weak。

结构,枚举,字符串,数字等值类型,传递方式为直接内存复制,考虑到效率也用到了CoW机制。

是否为空 nullable/nonnull

通过 var / let 限定符和 ? ! 解包操作符,变量在定义时就能确定是否为  nullable 还是 nonnull。

观察者方法 set / get

Swift 增加了计算值属性的 get 和 set 观察者方法,形式如下:

class Person {
	
    private var _name
    
    var name {
        get {
            return _name
        }
        set(newValue) {
            _name = newValue
        }
    }
}

对于 atomic / nonatomic

Swift 中的属性默认是 nonatomic,如果需要 atomic 属性,可以通过加锁的方式

class Person {
	var _name: String?
	let _name_lock = NSLock()
    
    var name {
    	get {
        	var value: String?
        	_name_lock.lock()
            value = _name
            _name_lock.unlock()
            return _name
        }
        set(newValue) {
        	_name_lock.lock()
            _name = newValue
            _name_lock.unlock()
        }
    }
}

Nicholas X.

山穷水复疑无路,柳暗花明又一村