'let'属性不能直接初始化;使用“ self.init(...)”或“ self = ...”代替

时间:2019-01-14 12:06:08

标签: swift

我想尝试在init扩展名中写入默认的protocol,所以我这样做了:

protocol P {
    var data: [AnyHashable: Any] { get }
    init(_ s: String)
}

extension P {
    init(_ s: String) {
        self.data = ["s": s]
    }
}

但是我遇到了这个错误:

  

'let'属性'data'可能无法直接初始化;使用“ self.init(...)”或“ self = ...”代替

我不知道这意味着什么。感谢您的帮助!

2 个答案:

答案 0 :(得分:5)

该错误表明该变量无法在协议扩展中初始化,因为该变量已声明为常量{ get }

但是,即使声明了变量{ get set },也不能在没有具体类型或关联类型约束的情况下使用init方法。

答案 1 :(得分:0)

import PlaygroundSupport

protocol P {
    var data: [AnyHashable: Any] { get }
    var _data: [AnyHashable: Any] { get set }
    static func generator(_ s: String) -> P
    init()
}

extension P {
    static func generator(_ s: String) -> P {
        var p = self.init()
        p._data = ["s": s]
        return p
    }
}

class A: P {
    required init() { }
    var data: [AnyHashable : Any] {
        return _data
    }
    var _data: [AnyHashable : Any] = [:]
}

let a = A.generator("some")
print(a.data)

PlaygroundPage.current.finishExecution()

我认为这是您想要的最接近的代码。问题是_data由其他类共享。