无法下标类型&#39; inout Array <array <any>&gt;的值

时间:2017-03-22 20:13:57

标签: swift multidimensional-array

我有一个2D数组:var matrixOfMutableObjects: Array<Array<Any>> 但是,当我尝试检查数组的某个位置上的值是否是我创建的枚举时,编译器会抱怨:Cannot subscript a value of type 'inout Array<Array<Any>>

if(x < 0 || x > ROWS || y < 0 || y > COLS){
            return false;
        } else if (matrixOfMutableObjects[x][y] != enumObject.NOTHING){
            return false;
        }

为什么我无法验证我的Array的位置x,y中的元素是否是我创建的类型enumObject.NOTHING?

public enum enumObject {
    case NOTHING
    case Wall
}

1 个答案:

答案 0 :(得分:2)

模式匹配(用于匹配枚举实例中的案例)和相等测试是两回事。

此外,包含在Any中的对象仅为编译器所知为Any,因此您需要在应用之前尝试转换为给定类型。模式匹配与该类型的情况(例如,如果转换为的类型是enum)。

E.g:

public enum enumObject {
    case NOTHING
    case Wall
}

var matrixOfMutableObjects: Array<Array<Any>> = [
    [1, "two"],
    [enumObject.NOTHING, 4.2]
]

let x = 1
let y = 0
// no bounds checking in this simple example!
if case .some(.NOTHING) = matrixOfMutableObjects[x][y] as? enumObject {
    print("Is nothing!")
}

或者,使用?句法糖:

// ...
if case .NOTHING? = matrixOfMutableObjects[x][y] as? enumObject {
    print("Is nothing!")
}

请注意,外部.some(...)模式匹配(或?糖)检查尝试将元素转换为enumObject是否成功。如果是这种情况,则对包含的对象(当时已知类型为enumObject)执行额外的模式匹配,以case enumObject {{1}特别是)。

Swift的好奇心:避免显式类型转换

正如@Hamish在下面的评论中所指出的,似乎枚举案例模式匹配实际上可以为你执行条件类型转换,这意味着你不需要求助于上面的显式转换和嵌套模式匹配({{1分别是}和.NOTHING / as?,但可以直接使用针对.some(...)案例的模式匹配,因为您还提供了?类型:

NOTHING

最后,请注意Swift API Guidelines规定了小写枚举案例,因此您可能希望使用案例enumif case enumObject.NOTHING = matrixOfMutableObjects[x][y] { print("Is nothing!") } ,而不是nothing和{{1} },以及wall类型的名称约定(所以更喜欢NOTHING而不是Wall)。