2015-03-12 8 views
6

Ich versuche, eine Funktion zu schreiben, die ein Objekt und einen Typ als Argumente akzeptiert und einen booleschen Wert zurückgibt, der angibt, ob das Objekt den angegebenen Typ hat oder nicht. Es scheint keinen Type-Typ zu geben, also weiß ich nicht, wie ich das machen soll. Das Beste, was ich habe in der Lage zu tun istGenerische Swift-Funktion zum Testen auf Objekttyp

func objectIsType<T>(object: AnyObject, someObjectOfType: T) -> Bool { 
    return object is T 
} 

So kann ich objectIsType(x, 5) tun, zu testen, ob x ein Int oder objectIsType(x, "hi") zu sehen, ob es sich um eine Zeichenfolge, aber ich möchte in der Lage sein objectIsType(x, Int) anrufen um zu sehen, ob x ein Int und objectIsType(x, String) ist, um zu sehen, ob es ein String ist. Ist so etwas möglich?

Edit:

verbesserte Fluggeschwindigkeits-Geschwindigkeit meiner Funktion und machte einen großen Punkt, um es genau zu tun, was is bereits der Fall ist. Die neue Funktion ist dies:

func objectIsType<T>(object: Any, someObjectOfType: T.Type) -> Bool { 
    return object is T 
} 

Was ich versuche zu validieren ist zu tun, dass die Werte eines [String: Any] Wörterbuch des Typs sind, die ich erwarte. Zum Beispiel:

let validator: [String: Any.Type] = [ 
    "gimme an int": Int.self, 
    "this better be a string": String.self 
] 

let validatee: [String: Any] = [ 
    "gimme an int": 3, 
    "this better be a string": "it is!" 
] 

for (key, type) in validator { 
    if !objectIsType(validatee[key], type) { 
     selfDestruct() 
    } 
} 

Aber ich bekomme den Fehler, <>protocol.Type is not convertible to T.type. Ich habe mir die Metatype-Dokumentation angeschaut, bin aber immer noch etwas verwirrt.

+2

Die Verwendung von 'AnyObject' ist hier gefährlich. 'x' wird von einer' Int' in eine 'NSNumber' umgewandelt, also' objectsIsType (5 als Int, 5 als Double) == true' –

+1

Vielleicht solltest du deine Änderung als eine andere Frage veröffentlichen. – rintaro

Antwort

2

Wenn Sie einen Typ als Argument liefern wollen, keinen Wert, können Sie folgendes tun:

func objectIsType<T>(object: Any, someObjectOfType: T.Type) -> Bool { 
    return object is T 
} 

let a: Any = 1 

objectIsType(a, Int.self) // returns true 

NB, AnyObject kann nur auf Klassen beziehen, nicht structs oder Aufzählungen. Int und String sind Strukturen. Wenn Sie Ihren Code ändern, wie ich oben, um eine Any zu nehmen, funktioniert es auch mit Strukturen.

Es mag wie Ihr Original erschienen sein, ohne diese Änderung gearbeitet, aber wirklich, was passierte war die Interop Ihre Int in eine NSNumber wurde die Umwandlung, die ein bisschen von Umwegen ist, Dinge zu tun und wird dem Metatyp nicht anpassen Ansatz.

Aber die Frage ist wirklich, warum denkst du, du brauchst das? is macht genau das schon.

+0

Danke @Airspeed! Würde mich freuen, irgendwelche Gedanken zu meinem Schnitt zu hören. – mway