我正在尝试使用整个我的应用程序中使用的元组类型。我像这样做初始混叠:
associatedtype JSONReplacementValue = (key: String, value: AnyObject?)
看起来很简单。在没有associatedtype
的情况下使用它时,一切正常。但是,一旦我将它们作为别名,我就会在以下两个地方出错:
var replacementValues: [JSONReplacementValue] = []
if let key = key {
replacementValues.append((key: key, value: value))
}
这会在.append
行上出错,告诉我Cannot invoke 'append' with an argument list of type '(key: String, value: AnyObject?)
。我已经尝试将我附加的内容替换为JSONReplacementValue(key: key, value: value)
之类的内容,但这会给我一个错误'Self.JSONReplacementValue' cannot be constructed because it has no accessible initializers
这是我无法解决的第一个错误。第二个发生在这段代码中:
for replacementValue in values {
json[replacementValue.key] = replacementValue.value
}
(values是JSONReplacementValue的数组,定义为像values: [JSONReplacementValue]
这样的参数)
当我尝试访问replacementValue.key
:Value of type 'Self.JSONReplacementValue' has no member 'key'
时,这会出错。这个我不知道如何解决它。
是否可以将元组设为associatedtype
?如果是这样,我在这里做错了什么?
答案 0 :(得分:1)
如果您想创建一个类型,请尝试使用typealias
关键字。 associatedtype
适用于协议。
此代码适用于swift 2.2:
typealias JSONReplacementValue = (key: String, value: Any?)
var replacementValues: [JSONReplacementValue] = []
replacementValues.append((key: "one", value: "value"))
print(replacementValues) // prints: [("one", Optional(value))]
另请注意,AnyObject
适用于班级类型,而Any
适用于所有类型。
另一件事是你使用Struct而不是元组会更好。
来自Apple Docs:
元组对临时的相关值组很有用。它们不适合创建复杂的数据结构。如果您的数据结构可能超出临时范围,则将其建模为类或结构,而不是作为元组。有关更多信息,请参阅类和结构。
答案 1 :(得分:0)
找到任何展望未来的答案。我在协议定义中声明了这一点。这些方法都在协议扩展中。通过将其更改为typealias
并将其移动到扩展中,一切都按预期工作。