协议中的get set:protocol中属性可以声明为{ get }或者{ get set }。大多数人第一眼肯定觉得{ get }是约束为 read-only 属性,{ get set }是约束为 read-write 属性。但是在protocol中这些约束都是最小约束,也就是说{ get }属性至少需要是 readable 的,至于它是否 writable 并不作要求;{ get set }则明确的指出了属性必须是可读写,但是官方文档说明了,用{ get set }声明的属性,不能在遵守该协议的类型中被实现为let属性。
protocol textprotocol{
var text: String { get }
var text2: String { get set }
}
extension textprotocol {
var text: String {
return "text111"
}
// var text2: String {
// return "text2222"
// }
}
class textClass: textprotocol {
var text2: String = "222222222"
}
let t = textClass()
print(t.text)
print(t.text2)
// t.text = "11111" 报错:text' is a get-only property
t.text2 = "22222"
print(t.text)
print(t.text2)
1.{ get set }声明的属性不能被实现为let
2.{ get set }声明的属性必须要实现,即使在扩展中给了默认值也要在类中实现
3.{ get }声明的属性如果扩展中默认了属性,则可以不用在类中实现
总结:{ get set }声明的属性必须在类中实现,{ get }声明的属性如果在扩展中给出默认值,则在类中可以不用实现,也可以使用在实现中使用let修饰,来确保只读属性
class中的get
ios开发中,如果我们设置一个只读属性,oc中很简单。get既可,那么在swift中如何做呢
//第一种,private (set) 把set设置为private的,也就是只读属性
private (set) var nameclass: String = "name"//只读
//第二种,利用计算属性
var getnameclass: String {
return nameclass
}
//第三种,利用方法
func getname() -> String{
return nameclass
}
网友评论