2016-02-01 3 views
0

Я уверен, что это простой вопрос для вас.Gameplaykit GKState, быстрая функция с двумя параметрами

Как написать func с двумя параметрами с одним GKState?

UPDATE

компании Apple использовать func willExitWithNextState(_ nextState: GKState)

Если я использую somefunc(state:GKState)работы мелкие

в то время как somefunc(state:GKState, string:String)does't работы, почему ???

Другой пример

Я попытался это:

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") 

Спасибо за ответ

ответ

0

Если вы хотите параметр быть классом, используйте Class.Type или AnyClass

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

и использовать Class.self в качестве аргумента

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

Update

Если вы Определение функции г

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") 
+0

Спасибо, я попробую дома. Но почему использование apple func willExitWithNextState (_ nextState: GKState)? И почему, если я использую somefunc (state: GKState), работает somefunc (state: GKState, string: String) does't work ??? –

+0

Первое решение - это то, что я хочу! благодаря! Не второй, потому что я должен проверять класс, а не istance. –

+0

Вы можете использовать '.dynamicType', если вам нужно проверить тип/класс объекта (см. Мое обновленное 2-е решение). – 0x141E

0

На протяжении вас r, вы использовали 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 

Вы также внесли большинство своих опций с помощью «?», В то время как это не выглядит обязательным. Например:

printState(nil) // What should this do? 
+0

Мне нужно определение класса. Необязательные параметры необходимы для моего кода. Я обновлю код, чтобы лучше объяснить –

Смежные вопросы