我有许多实现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
从可选对象获取的,这使您无法在其上调用初始化程序。
我确实发现以下作品,即使。(这是一个错误)。extendedInfo
是nil
user.extendedInfo = user.extendedInfo!.dynamicType.init(json: sampleJSON)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句