如何在Swift存储属性中制作协议及其扩展?

时间:2019-03-08 21:08:39

标签: swift protocols protected protocol-extension

以下是“问题”的变通办法,该问题在Swift中的协议及其扩展名不存储属性。似乎“奏效”,但我想知道人们为什么会避免它?

fileprivate var strings: [String] = []

protocol SomeProat {
    func add(someString: String)
}

extension SomeProat {
    func add(someString: String) {
        strings.append(someString)
        print(strings)
    }
}

(我知道这个问题可以解释为主观)。

1 个答案:

答案 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"]