2016-02-01 4 views
0

Je suis sûr que c'est une question simple pour vous.Gameplaykit GKState, fonction rapide avec deux paramètres

Comment écrire une fonction avec deux paramètres avec un GKState?

MISE À JOUR

utiliser d'Apple func willExitWithNextState(_ nextState: GKState)

Si je somefunc(state:GKState)œuvres fines

tandis que somefunc(state:GKState, string:String)travail does't, pourquoi ???

Autre exemple

J'ai essayé ceci:

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?' 

MERCI SOLUTION @ 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") 

Merci pour la réponse

Répondre

0

Si vous voulez un paramètre à une classe, utilisez Class.Type ou AnyClass

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

et utiliser Class.self comme argument

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

Mise à jour

Si vous définition de la fonction r est

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

vous devrez passer dans une instance de GKState (ou une sous-classe de GKState) comme premier argument, et non pas la classe/sous-classe elle-même. Par exemple,

let pippo = Pippo() 

printState (pippo, "Hello") 
+0

Merci, je vais essayer à la maison. Mais pourquoi apple utilise func willExitWithNextState (_ nextState: GKState)? Et pourquoi si j'utilise somefunc (state: GKState) fonctionne, alors que somefunc (state: GKState, string: String) ne fonctionne pas ??? –

+0

La première solution est ce que je veux! Merci! Pas la seconde parce que je dois vérifier la classe, pas l'istance –

+0

Vous pouvez utiliser '.dynamicType' si vous avez besoin de vérifier le type/la classe d'un objet (voir ma 2ème solution mise à jour). – 0x141E

0

Tout au long de vous r exemple de code que vous avez utilisé AnyClass, alors que vous devriez (probablement) utiliser AnyObject. AnyClass fait référence à une définition de classe, tandis que AnyObject est une instance d'une classe.

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 

Vous avez également fait la plupart de vos paramètres optionnels avec le "?", Alors que cela ne semble pas nécessaire. Par exemple:

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

J'ai besoin d'une définition de classe. Les paramètres facultatifs sont nécessaires pour mon code. Je vais mettre à jour avec du code pour expliquer mieux –