【问题标题】:Swift dynamictype initialisation with dynamic protocol type使用动态协议类型进行 Swift 动态类型初始化
【发布时间】:2016-08-17 09:22:58
【问题描述】:

我有许多实现Resource 协议的结构。这定义了它们必须有一个变量extendedInfo,它符合ExtendedInfo 协议,以提供一种通过init(json: [String: AnyObject] 用json 初始化它们的方法。我试图提供一种使用 JSON 动态实例化这些的方法,提供正确的 ExtendedInfo 类型并将其分配给结构的 extendedInfo 变量。但是,当我尝试通过他们的 dynamicType 实例化它们时,我遇到了 Argument labels '(json:)' do not match any available overloads 错误

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

有什么想法吗?谢谢

【问题讨论】:

    标签: swift struct protocols dynamictype associated-types


    【解决方案1】:

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

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

    其次,您可以使用给定结构的dynamicType 的协议关联类型来使用给定的初始化程序。例如:

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

    至于为什么您当前的代码不起作用,我怀疑这是因为您从一个可选项中获取了 dynamicType,这会阻止您在其上调用您的初始化程序。


    我确实发现以下工作有效,即使 extendedInfonil。 (This is a bug)。

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

    【讨论】:

    • @trundrumbalind 乐于助人:)
    【解决方案2】:

    变化:

    let user = User()
    

    收件人:

    var user = User()
    

    试试这个:

    user.extendedInfo = UserExtendedInfo(json: sampleJSON)
    

    【讨论】:

    • 这个想法是我没有明确说明我要初始化哪个...ExtendedInfo 对象。我希望能够从extendedInfo 变量的类型中推断出哪一个,以便它可以与任何遵守Resource 协议的对象一起使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    • 2019-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多