在Objective-C中有readonly、readwrite修饰词,那么在Swift里呢?那就就是set/get,在Swift里实现了set/get方法的属性叫做计算属性,顾名思义,它只负责逻辑,没有存储空间。它一般需要和存储属性配合使用。 在`Objective-C中`,只读属性只需要用`readonly`修饰即可,但可以用KVC修改。`Swift`中则是通过计算属性来实现,由于计算属性没有直接的存储空间,故即便是继承了`NSObject`也不能用KVC修改。`Swift`中有真正私有的属性,`Objective-C`中没有。 只读属性在`Objective-C`中定义很简单: ```objective-c .h @property (nonatomic, readonly, copy) NSString *test; ``` `test`属性就是只读属性了,不过在其实现文件(.m)里面可以用`_test`来访问修改。`readonly`修饰仅仅是禁止使用点语法访问该属性。 ```objective-c v.test = @"123213"; //编译报错,因为`test`是只读的 [v setValue:@"12312312" forKey:@"test"]; //可以运行,并且`test`的值被修改(KVC) //在其实现文件(.m)里还可以用 _test = @"12312312123"; //这样也可以 ``` 只读属性在`Swift`就稍微麻烦点了 ```swift class Test: NSObject { static private var _default : Test! //`default`就是只读属性,需要定义一个私有存储属性保存具体的值 static var `default` : Test! { get{ if _default == nil { _default = Test() } return _default } } static private var _default1 : Test! //相当于Objective-C中重写了-(void)setDefault1:(Test *)default1 和 - (Test *)default1 这两个方法。可以对`default1`的值做限制,比如下面的代码`default1`的值一定不为nil,如果是nil读取的时候会初始化一个Test对象,如果将要对`default1`赋一个nil也不会修改`default1`的值。 static var `default1` : Test! { get{ if _default1 == nil { _default1 = Test() } return _default1 } set{ if newValue != nil{ _default1 = newValue } } } static private var _default2 : Test! //这种写法编译时通不过的,实现了set方法的属性有一定要有get static var `default2` : Test! { set{ _default2 = newValue } } } ``` 这些就是我对`Swift`中`set/get`的理解了,如果以后再加深对它的研究再更新文章吧。
没有评论