2014-08-27 16 views
14

Przekazałem parametr do funkcji typu AnyObject, ponieważ wszystko można przekazać do niego. Czy istnieje sposób dynamicznego uzyskania typu obiektu?Uzyskaj dynamicznie typ AnyObject w Swift

+0

chciałbym powiedzieć, że nie ma jednej odpowiedzi w tym temacie nie został mi pomóc. Mój problem polegał na tym, że nie mogę uzyskać informacji o typie podczas debugowania, aby dowiedzieć się jak obsługiwać obiekt Any, aby zobaczyć rzeczywistą zawartość, ponieważ nie znałem typu Dowolnego obiektu, którego nie znałem, jakiego typu potrzebuję aby przesłać go, aby zobaczyć zawartość. Najlepszym rozwiązaniem dla mnie jest przesłać obiekt Any do NSObject i sprawdzić jego właściwość className na przykład: ((json ["glossary"] jako NSDictionary) ["title"] jako NSObject) .className pokazuje mi "__NSDictionaryM "i na przykład: – Pavel

Odpowiedz

12

Zazwyczaj to właśnie leki generyczne są przeznaczone. Istnieje rzadko dobry powód, aby kod AnyObject nie wchodził w interakcje z ObjC. Jeśli wykonujesz różne akcje w zależności od typu, prawdopodobnie masz zamiar użyć przeciążenia.

To powiedziawszy, istnieje kilka sposobów uzyskania dostępu do typu. Zwykle chcesz uruchomić inny kod w zależności od typu, dzięki czemu można używać switch na to:

let x:AnyObject = "asdf" 
switch x { 
case is String: println("I'm a string") 
default: println("I'm not a string") 
} 

lub

let x:AnyObject = "asdf" 
switch x { 
case let xString as String: println("I'm a string: \(xString)") 
default: println("I'm not a string") 
} 

Albo można użyć, jeśli:

if let string = x as? String { 
    println("I'm a string: \(string)") 
} 

Zobacz "Typ Cast Cast Any Any i AnyObject" w Swift Programming Language, aby uzyskać więcej informacji.

Ale znowu, jeśli nie pracujesz z kodem ObjC, rzadko pojawia się powód, aby używać Any lub AnyObject. Generics i przeciążenia są narzędziami zaprojektowanymi do rozwiązania tych problemów w Swift.

0

Fundacja Pierwszy import

a jeśli wa typ test1 zrobić:

var test1 = "test" 

println(_stdlib_getTypeName(test1)) 

Dostaniesz "TST" TST oznaczać String.

jeśli chcesz spróbować z Int byłoby TtSi (i dla int)

+1

Należy pamiętać, że te nazwy typów są prywatne i mogą ulec zmianie w dowolnym momencie. Główny znak podkreślenia w nazwie funkcji jest wskaźnikiem firmy Apple, że jest to funkcja wewnętrzna, której nie można wywołać spoza stdlib. –

+0

Użycie nierozwiązanego identyfikatora "_stdlib_getTypeName" – Sander

28

Nie jest jasne, co masz na myśli przez "typ" w pytaniu. Dla dowolnej wartości dowolnego typu w Swift można uzyskać typ dynamicznego środowiska wykonawczego:

theVariable.dynamicType 

Co można z tym zrobić, to kolejne pytanie.

Swift 3 wersja z odrobiną @jojodmo „s:

type(of: theVariable) 
+0

Powinien to być adres poczty elektronicznej dla tego pytania. –

+8

W Swift 3, został zmieniony na 'type (of: theVariable)' – Jojodmo

0
func testType(value:AnyObject!){ 

    if let v = value as? NSString{ 

     println("NSString") 

    }else if let v = value as? NSNumber{ 

     println("NSNumber") 

    }else if let v = value as? Double{ 

     println("Double") 

    }else if let v = value as? Int{ 
     println("Int") 
    } 
} 
+0

Proszę dodać wyjaśnienie. –