以下是“问题”的变通办法,该问题在Swift中的协议及其扩展名不存储属性。似乎“奏效”,但我想知道人们为什么会避免它?
fileprivate var strings: [String] = []
protocol SomeProat {
func add(someString: String)
}
extension SomeProat {
func add(someString: String) {
strings.append(someString)
print(strings)
}
}
(我知道这个问题可以解释为主观)。
答案 0 :(得分:3)
在非Apple平台上的纯Swift中,没有很好的方法来完成您要问的事情。
如果您使用的是Apple平台(macOS,iOS,tvOS,watchOS),并且符合类型是类,则可以使用Objective-C运行时提供的相关对象支持:
import ObjectiveC
protocol MyProtocol: class {
var strings: [String] { get }
func add(someString: String)
}
private var MyProtocolSomeStringKey: UInt8 = 0
extension MyProtocol {
var strings: [String] {
get {
return objc_getAssociatedObject(self, &MyProtocolSomeStringKey) as? [String] ?? []
}
set {
let value = newValue.isEmpty ? nil : newValue
objc_setAssociatedObject(self, &MyProtocolSomeStringKey, value, .OBJC_ASSOCIATION_RETAIN)
}
}
func add(someString: String) {
strings.append(someString)
}
}
class MyObject { }
extension MyObject: MyProtocol { }
let myObject = MyObject()
myObject.add(someString: "hello")
myObject.add(someString: "world")
print(myObject.strings)
// Output: ["hello", "world"]