Swift的Types Arrays类型元素无法识别为类型

问题描述

我对某些GKState具有以下实现

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 $0 })
    }
}

class Paused: GKState {}

class Over: GKState {}

有人暗示我为什么在Expected type after 'is'得到$0吗? validNextStates被定义为GKState类型的数组,那么为什么其中一个元素未被识别为类型?

编辑:

Xcode:版本12.1(12A7403)

解决方法

问题是stateClass的类型。 stateClass的类型为AnyClass,这只是AnyObject.Type的类型别名,因此stateClass是元类型,而不是普通类型,因此is不能在其上使用运算符。

但是,要比较元类型,可以使用相等运算符。

class Running: GKState {
    let validNextStates: [GKState.Type] = [Paused.self,Over.self]

    override func isValidNextState(_ stateClass: AnyClass) -> Bool {
        return self.validNextStates.contains(where: { $0 == 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 { $0 is State.Type } )
  else { throw GKState.Error.invalid }
}
extension GKState {
  enum Error: Swift.Error {
    case invalid
  }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...