我有一段代码,如下所示:
protocol SomeProtocol {
}
struct SomeObject: SomeProtocol {
}
struct Test {
var arr: [[SomeProtocol]]
mutating func testFunction(objs:[[SomeObject]]) {
self.arr = objs
}
}
如您所见,SomeObject
确认了协议,但编译器向我显示了
error " cannot assign value of type '[[SomeObject]]' to type '[[SomeProtocol]]'".
有人能告诉我原因吗?
非常感谢!
因为[[SomeObject]]
与[[SomeProtocol]]
的类型不同-请参阅@TeeJay上面的评论。如何是这样解决的:
protocol SomeProtocol {
}
struct SomeObject: SomeProtocol {
}
struct Test {
var arr: [[SomeProtocol]]
mutating func testFunction(objs:[[SomeObject]]) {
self.arr = []
for a in objs {
var innerArray = [SomeProtocol]()
for e in a {
innerArray.append(e)
}
self.arr.append(innerArray)
}
}
}
或者,正如@MartinR所指出的,您可以使用map
。
如果我试图用短路内环
self.arr = []
for a in objs {
self.arr.append(a)
}
我收到错误"无法将类型为"Array<;SomeObject>;"的值转换为预期的参数类型[SomeProtocol]",这在某种程度上是完全正确的-它们不相同-是元素而不是集合符合协议。数组分配不会深入到协议一致性的最终元素类型,除非您明确地这样做。
这并不完全令人惊讶——你不会期望以下内容起作用:
struct SomeOther1 {
var a : SomeProtocol
}
struct SomeOther2 {
var a : SomeObject
}
let x = SomeOther2(a: SomeObject())
let y: SomeOther1 = x // ERROR
而这应该(而且确实)起作用:
let x = SomeOther2(a: SomeObject())
let y = SomeOther1(a: x.a)
由于数组是使用泛型的Struct
,我们可以使用泛型来尝试同样的方法:
struct SomeOther<T> {
var a: T
}
let z = SomeOther<SomeObject>(a: SomeObject()) // OK, of course
let w = SomeOther<SomeProtocol>(a: SomeObject()) // OK, as expected
let v: SomeOther<SomeProtocol> = z // Doesn't work - types are not the same.