iOS中经常看到一些系统类的属性是get-only
的,一旦你想对它进行修改,编译器就会提示Cannot assign to property: 'i' is a get-only property。顺着提示的思路,我们知道这个属性只读的,也就是只有getter没有setter,真实的数据由其他属性储存,且那个属性是私有的,这个只读属性只是它的外部接口。那我们设计的时候就可以像这样:
方法一
class Class {
private var _i: Int = 0
var i: Int {
get {
return _i
}
}
}
这样,我们就可以保护_i
属性不被外部修改了。当你在外部试图修改对i进行修改时,编译器会提示Cannot assign to property: 'i' is a get-only property,这样我们就首先了成员变量(属性)外部只读的功能了。
然而,每次都为了一个只读属性写这么长一串代码,显然有些费事。查阅资料以后,我发有一种简单写法:
方法二
class Class {
private(set) var i: Int = 0
}
外部试图对i进行修改时,编译器会提示Cannot assign to property: 'i' setter is inaccessible。这和前面的提示有点区别,区别在于:方法一没有setter,只有getter;方法二有setter,但set
方法不能被调用。实际使用中这两种方法是没有太大区别的,如果你们知道些其他需要注意的,欢迎补充。
通过上面两个的实验对比,我们能知道官方的get-only
属性确实是用方法一实现的,但实际使用过程中,为了代码简洁性,建议使用方法二。