我有一个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
}
答案 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}特别是)。
正如@Hamish在下面的评论中所指出的,似乎枚举案例模式匹配实际上可以为你执行条件类型转换,这意味着你不需要求助于上面的显式转换和嵌套模式匹配({{1分别是}和.NOTHING
/ as?
,但可以直接使用针对.some(...)
案例的模式匹配,因为您还提供了?
类型:
NOTHING
最后,请注意Swift API Guidelines规定了小写枚举案例,因此您可能希望使用案例enum
和if case enumObject.NOTHING = matrixOfMutableObjects[x][y] {
print("Is nothing!")
}
,而不是nothing
和{{1} },以及wall
类型的名称约定(所以更喜欢NOTHING
而不是Wall
)。