Gameplaykit GKState,带有两个参数的swift函数

时间:2016-02-01 22:25:32

标签: ios swift types gameplay-kit

我确信这对你来说是一个简单的问题。

如何使用一个GKState编写带有两个参数的func?

更新

Apple使用  func willExitWithNextState(_ nextState: GKState)

如果我使用somefunc(state:GKState) 工作罚款

虽然somefunc(state:GKState, string:String) 无法正常工作,但为什么???

其他示例

我试过这个:

class Pippo:GKState {}

//1
func printState (state: GKState?) {
    print(state)
}

printState(Pippo) //Error cannot convert value of type '(Pippo).Type' (aka 'Pippo.Type') to expected argument type 'GKState?'

//2
func printStateAny (state: AnyClass?) {
    print(state)
}
printStateAny(Pippo) //NO Error


//3
func printStateGeneral <T>(state: T?) {
    print(state)
}
printStateGeneral(Pippo) //No Error

//4
func printStateAnyAndString (state: AnyClass?, string:String) {
    print(state)
    print(string)
}

printStateAnyAndString(Pippo/*ExpectedName Or costructor*/, string: "Hello") //ERROR
printStateAnyAndString(Pippo()/*ExpectedName Or costructor*/, string: "Hello") //ERROR cannot convert value of type 'Pippo' to expected argument type 'AnyClass?'

解决方案感谢@ 0x141E

func printStateAnyAndString (state: GKState.Type, string:String) {
    switch state {
    case is Pippo.Type:
        print("pippo")
    default:
        print(string)
    }
}

printStateAnyAndString(Pippo.self, string: "Not Pippo")

感谢您的回复

2 个答案:

答案 0 :(得分:0)

在整个示例代码中,您使用了AnyClass,而您应该(可能)使用AnyObject。 AnyClass引用类定义,而AnyObject是类的实例。

class MyClass { }

func myFunc1(class: AnyClass)
func myFunc2(object: AnyObject)

let myObject = MyClass() // create instance of class

myFunc1(MyClass)         // myFunc1 is called with a class
myFunc2(myObject)        // myFunc2 is called with an instance

您还使用&#34;?&#34;制作了大多数参数选项,但它看起来并不需要。例如:

printState(nil) // What should this do?

答案 1 :(得分:0)

如果您希望参数成为某个班级,请使用Class.TypeAnyClass

func printState (state: AnyClass, string:String) {
    print(state)
    print(string)
}

并使用Class.self作为参数

printState(Pippo.self, string:"hello pippo")

<强>更新

如果你的功能定义是

func printState (state:GKState, string:String) {
    if state.isValidNextState(state.dynamicType) {
        print("\(state.dynamicType) is valid")
    }
    print(state)
    print(string)
}

您需要传入GKState(或GKState的子类)的实例作为第一个参数,而不是类/子类本身。例如,

let pippo = Pippo()

printState (pippo, "Hello")