苹果在"Swift编程语言文档"中指出:
如果协议只需要属性可读取,那么任何类型的属性都可以满足要求,如果这对你自己的代码有用,属性也可以是可设置的。
因此,以下五个Playground代码片段都是有效的:
示例#1:常量属性
protocol FullyNamed {
var fullName: String { get }
}
struct Duck: FullyNamed {
let fullName: String
}
let scrooge = Duck(fullName: "Scrooge McDuck")
print(scrooge.fullName)
例子 #2:变量属性
protocol FullyNamed {
var fullName: String { get }
}
struct Duck: FullyNamed {
var fullName: String
}
var scrooge = Duck(fullName: "Scrooge McDuck")
print(scrooge.fullName)
scrooge.fullName = "Scrooge H. McDuck"
print(scrooge.fullName)
示例 #3:计算属性(只读)
protocol FullyNamed {
var fullName: String { get }
}
struct Duck: FullyNamed {
private var name: String
var fullName: String {
return name
}
}
let scrooge = Duck(name: "Scrooge McDuck")
print(scrooge.fullName)
示例 #4:计算属性(获取和设置)
protocol FullyNamed {
var fullName: String { get }
}
struct Duck: FullyNamed {
private var name: String
var fullName: String {
get {
return name
}
set {
name = newValue
}
}
}
var scrooge = Duck(name: "Scrooge McDuck")
print(scrooge.fullName)
scrooge.fullName = "Scrooge H. McDuck"
print(scrooge.fullName)
例子 #5:private(set)
变量属性
protocol FullyNamed {
var fullName: String { get }
}
public struct Duck: FullyNamed {
public private(set) var fullName: String
public init(fullName: String) {
self.fullName = fullName
}
public mutating func renameWith(fullName: String) {
self.fullName = fullName
}
}
var scrooge = Duck(fullName: "Scrooge McDuck")
print(scrooge.fullName)
scrooge.renameWith("Scrooge H. McDuck")
print(scrooge.fullName)
苹果公司也指出:
如果协议要求一个属性既可读又可写,则该属性的要求不能通过常量存储属性或只读计算属性来实现。
因此,以下两个Playground代码片段不是有效的:
示例#1:常量属性
protocol FullyNamed {
var fullName: String { get set }
}
struct Duck: FullyNamed {
let fullName: String
}
let scrooge = Duck(fullName: "Scrooge McDuck")
示例 #2:计算属性(仅获取)
protocol FullyNamed {
var fullName: String { get set }
}
struct Duck: FullyNamed {
private var name: String
var fullName: String {
return name
}
}
var scrooge = Duck(name: "Scrooge McDuck")
示例 #3:计算属性(只读)
protocol FullyNamed {
var fullName: String { get }
}
struct Duck: FullyNamed {
var fullName: String {return "Scrooge McDuck"}
init(fullName: String) {
self.fullName = fullName
}
}