【发布时间】:2015-12-23 22:14:48
【问题描述】:
我在下面列出了一个相当人为的例子,来自我正在研究的更大的东西。我遇到了我认为是关于使用 Any 类型的 Swift 编译器错误。
struct Labelable <T> {
let t: T
let label: String
}
func allLabels(labelables: [Labelable<Any>]) -> [String] {
return labelables.map { $0.label }
}
let labeledInt = Labelable(t: 22, label: "Steve's Age")
let labeledString = Labelable(t: "Johnson", label: "Stacy's last name")
let labels = allLabels([labeledInt, labeledString])
print(labels)
有问题的错误:
Cannot convert value of type 'Labelable<Int>' to expected element type 'Labelable<protocol<>>'
有没有人对此问题有任何见解和解决方法?或者,也许有更好的方法来完成我想做的事情?
谢谢
编辑:
这就是我最终要做的。啊。
protocol LabelableProtocol {
var label: String { get }
}
struct Labelable <T>: LabelableProtocol {
let t: T
let label: String
}
func allLabels(labelables: [LabelableProtocol]) -> [String] {
return labelables.map { $0.label }
}
let labeledInt = Labelable(t: 22, label: "Steve's Age")
let labeledString = Labelable(t: "Johnson", label: "Stacy's last name")
let labels = allLabels([labeledInt, labeledString])
print(labels)
【问题讨论】:
-
我认为问题在于 Swift 泛型不是协变的,也不是逆变的。通用混凝土类型仅等于相同的混凝土类型。您可以通过使用通用协议而不是任何类型约束来实现您想要的。查看 mike ash mikeash.com/pyblog/… 的这篇博文
-
这就是我最终要做的。谢谢!
标签: arrays swift generics compiler-errors any