我有一段如下代码:
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]]'".
有人可以告诉我原因吗?
非常感谢!
答案 0 :(得分:2)
由于[[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)
}
我收到错误"无法转换类型'数组< 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)
由于Arrays是使用泛型的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.