为swift中的二维数组赋值



我有一段代码,如下所示:

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.