Swift 类型数组元素未被识别为类型
Swift Array of Types element not recognised as type
我有一些 GKStates 的以下实现
import GameplayKit.GKState
class Running: GKState {
let validNextStates: [GKState.Type] = [Paused.self, Over.self]
override func isValidNextState(_ stateClass: AnyClass) -> Bool {
return self.validNextStates.contains(where: { stateClass is [=11=] })
}
}
class Paused: GKState {}
class Over: GKState {}
有人能告诉我为什么我在 [=13=]
得到 Expected type after 'is'
吗? validNextStates
被定义为 GKState 类型的数组,那么为什么其中一个元素未被识别为类型?
编辑:
Xcode:版本 12.1 (12A7403)
问题是 stateClass
的类型。 stateClass
是 AnyClass
类型,它只是 AnyObject.Type
的类型别名,因此 stateClass
是 meta-type,不是普通类型,所以 is
运算符不能用于它。
但是,要比较元类型,您可以使用相等运算符。
class Running: GKState {
let validNextStates: [GKState.Type] = [Paused.self, Over.self]
override func isValidNextState(_ stateClass: AnyClass) -> Bool {
return self.validNextStates.contains(where: { [=10=] == stateClass })
}
}
class Paused: GKState {}
class Over: GKState {}
class Invalid: GKState {}
Running().isValidNextState(Paused.self) // true
Running().isValidNextState(Invalid.self) // false
is
不能用于变量。
如果 GameplayKit 不是用 Objective-C 编写的,它可能是一个有效的选择。不幸的是,无法将其转发给 isValidNextState
,因为 AnyClass
信息不足,因此请像 Dávid 展示的那样使用 ==
。
func validateNextState<State: GKState>(_: State.Type) throws {
guard ( validNextStates.contains { [=10=] is State.Type } )
else { throw GKState.Error.invalid }
}
extension GKState {
enum Error: Swift.Error {
case invalid
}
}
我有一些 GKStates 的以下实现
import GameplayKit.GKState
class Running: GKState {
let validNextStates: [GKState.Type] = [Paused.self, Over.self]
override func isValidNextState(_ stateClass: AnyClass) -> Bool {
return self.validNextStates.contains(where: { stateClass is [=11=] })
}
}
class Paused: GKState {}
class Over: GKState {}
有人能告诉我为什么我在 [=13=]
得到 Expected type after 'is'
吗? validNextStates
被定义为 GKState 类型的数组,那么为什么其中一个元素未被识别为类型?
编辑:
Xcode:版本 12.1 (12A7403)
问题是 stateClass
的类型。 stateClass
是 AnyClass
类型,它只是 AnyObject.Type
的类型别名,因此 stateClass
是 meta-type,不是普通类型,所以 is
运算符不能用于它。
但是,要比较元类型,您可以使用相等运算符。
class Running: GKState {
let validNextStates: [GKState.Type] = [Paused.self, Over.self]
override func isValidNextState(_ stateClass: AnyClass) -> Bool {
return self.validNextStates.contains(where: { [=10=] == stateClass })
}
}
class Paused: GKState {}
class Over: GKState {}
class Invalid: GKState {}
Running().isValidNextState(Paused.self) // true
Running().isValidNextState(Invalid.self) // false
is
不能用于变量。
如果 GameplayKit 不是用 Objective-C 编写的,它可能是一个有效的选择。不幸的是,无法将其转发给 isValidNextState
,因为 AnyClass
信息不足,因此请像 Dávid 展示的那样使用 ==
。
func validateNextState<State: GKState>(_: State.Type) throws {
guard ( validNextStates.contains { [=10=] is State.Type } )
else { throw GKState.Error.invalid }
}
extension GKState {
enum Error: Swift.Error {
case invalid
}
}