无法下标类型为"inout Array<Array"的值<Any>>



我有一个二维数组: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;
}

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

public enum enumObject {
case NOTHING
case Wall
}

模式匹配(用于枚举实例中的匹配案例)和相等性测试是两个不同的东西。

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

例如:

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)执行额外的模式匹配,以给定的enumObjectcase(特别是.NOTHING)。


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

正如@Hamish在下面的评论中指出的那样,枚举大小写模式匹配似乎实际上可以为您执行条件类型转换,这意味着您无需诉诸上面的显式强制转换和嵌套模式匹配(分别为as?.some(...)/?),而是可以直接对NOTHING情况使用模式匹配, 假设您还提供了enum类型:

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

最后,请注意,Swift API 指南规定了小写枚举大小写,因此您可能希望使用大小写nothingwall,而不是NOTHINGWall,此外还CamelCase类型的名称约定(因此更喜欢EnumObject而不是enumObject)。

最新更新