我有一个二维数组: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
)执行额外的模式匹配,以给定的enumObject
case
(特别是.NOTHING
)。
Swift 的好奇心:避免显式类型转换
正如@Hamish在下面的评论中指出的那样,枚举大小写模式匹配似乎实际上可以为您执行条件类型转换,这意味着您无需诉诸上面的显式强制转换和嵌套模式匹配(分别为as?
和.some(...)
/?
),而是可以直接对NOTHING
情况使用模式匹配, 假设您还提供了enum
类型:
if case enumObject.NOTHING = matrixOfMutableObjects[x][y] {
print("Is nothing!")
}
最后,请注意,Swift API 指南规定了小写枚举大小写,因此您可能希望使用大小写nothing
和wall
,而不是NOTHING
和Wall
,此外还CamelCase
类型的名称约定(因此更喜欢EnumObject
而不是enumObject
)。