2015-03-12 18 views
6

Próbuję napisać funkcję, która pobiera obiekt i typ jako argumenty i zwraca wartość logiczną wskazującą, czy obiekt jest danego typu. Wygląda na to, że nie ma typu, więc nie jestem pewien, jak to zrobić. Najlepszą udało mi się zrobić toOgólna funkcja Swift do testowania typu obiektu

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

Więc mogę zrobić objectIsType(x, 5), aby sprawdzić, czy x jest Int lub objectIsType(x, "hi"), aby zobaczyć, czy jest to ciąg znaków, ale chciałbym, aby móc nazwać objectIsType(x, Int) aby sprawdzić, czy x jest Int i objectIsType(x, String), aby sprawdzić, czy jest to String. Czy coś takiego jest możliwe?

Edit:

Airspeed Velocity poprawił moją funkcję i zrobiła wielki punkt o nim robi dokładnie to, co is już robi. Nowa funkcja jest taka:

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

Co staram się robić to, aby potwierdzić, że wartości słownika [String: Any] są typu, że ja się spodziewać. Na przykład:

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() 
    } 
} 

Ale pojawia się błąd, <>protocol.Type is not convertible to T.type. Przyjrzałem się dokumentacji Metatype, ale wciąż jestem nieco zdezorientowany.

+2

Używanie "AnyObject" jest tutaj niebezpieczne. 'x' zostanie przekonwertowany z' Int' na 'NSNumber', więc' objectIsType (5 jako Int, 5 jako Double) == true' –

+1

Może, powinieneś opublikować swoją edycję jako kolejne pytanie. – rintaro

Odpowiedz

2

Jeśli chcesz podać typ jako argument, a nie wartość, można wykonać następujące czynności:

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 może odnosić się tylko do klas, a nie kodowanym lub wyliczenia. Int i String są strukturami. Jeśli zmienisz swój kod, tak jak ja powyżej, do podjęcia Any, działa również z structs.

To może się wydawać jak oryginał pracował bez tej zmiany, ale tak naprawdę to, co się dzieje, był współdziałanie została konwersja Int się z NSNumber który jest trochę okrężną sposób robienia rzeczy i nie będzie dostosowywać się do metatype oparte na podejściu.

Ale tak naprawdę pytanie brzmi: dlaczego uważasz, że tego potrzebujesz? is już to robi.

+0

Dzięki @Airspeed! Chciałbym usłyszeć jakieś przemyślenia na temat mojej edycji. – mway

Powiązane problemy