Swift dynamictype 与动态Protocol类型初始化

标签: Swift protocols
发布时间: 2017/3/5 23:51:51
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有大量的结构实现了 Resource Protocol。这定义了他们必须有一个变量 extendedInfo ,顺应了 ExtendedInfo Protocol提供一种方法来初始化它们通过 json init(json: [String: AnyObject] 。我试图提供一种方法来动态地实例化这些,json,提供正确类型的 ExtendedInfo 并将它分配给该结构的 extendedInfo 变量。然而,我得到 Argument labels '(json:)' do not match any available overloads 错误时尝试实例化它们通过其dynamicType

protocol Resource {

    associatedtype ExtendedInfoTypeAlias: ExtendedInfo

    var extendedInfo: ExtendedInfoTypeAlias? { get set }
}

protocol ExtendedInfo {
    init(json: [String: AnyObject])
}

struct User: Resource {

    typealias ExtendedInfoTypeAlias = UserExtendedInfo

    let name: String = "Name"
    var extendedInfo: UserExtendedInfo?
}

struct UserExtendedInfo: ExtendedInfo {

    let age: Int?

    init(json: [String: AnyObject]) {
        age = json["age"] as? Int
    }
}


let user = User()
let sampleJSON = ["age": 50]

let userExtendedInfo = user.extendedInfo.dynamicType.init(json: sampleJSON) // Argument labels '(json:)' do not match any available overloads
user.extendedInfo = userExtendedInfo

任何想法的家伙吗?谢谢你

解决方法 1:

首先,你不需要显式定义的类型 ExtendedInfoTypeAlias 在结构的实施 — — 你可以让它通过您提供的类型来推断 extendedInfo

struct User: Resource {
    let name: String = "Name"
    var extendedInfo: UserExtendedInfo?
}

第二的是,您可以只使用议定书 》 的关联的类型你给定结构的 dynamicType 要使用你给定的 initialiser。例如︰

user.extendedInfo = user.dynamicType.ExtendedInfoTypeAlias.init(json: sampleJSON)
print(user.extendedInfo) // Optional(Dynamic_Protocols.UserExtendedInfo(age: Optional(50)))

至于为什么你当前的代码不起作用,我怀疑它是由于这样一个事实,你得到 dynamicType 从一个可选的 — — 这防止你对它调用你的 initialiser。


我没有发现以下的工作,甚至当 extendedInfonil 。(这是一个 bug)。

user.extendedInfo = user.extendedInfo!.dynamicType.init(json: sampleJSON)

赞助商