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 的类型。 stateClassAnyClass 类型,它只是 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
  }
}