使用动态协议类型的Swift动态类型初始化

颤音

我有许多实现Resource协议的结构这定义了它们必须具有一个extendedInfo符合ExtendedInfo协议的变量以提供一种通过json via对其进行初始化的方法init(json: [String: AnyObject]我正在尝试提供一种使用JSON动态实例化它们的方法,提供正确的类型ExtendedInfo并将其分配给struct的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

有想法吗?谢谢

哈米什

首先,您不需要ExtendedInfoTypeAlias在struct实现中明确定义类型-您可以通过提供的类型来推断它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这是一个错误)。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章