2014-08-27 2 views
14

Я передал параметр функции типа AnyObject, потому что все может быть передано ему. Есть ли способ получить динамический тип передаваемого объекта?Получить тип AnyObject динамически в Swift

+0

Я хотел бы сказать, что ни один из ответов на эту тему не было мне помочь. Моя проблема заключалась в том, что я не мог получить информацию о типе во время отладки, узнать, как обрабатывать объект Any, чтобы увидеть фактический контент, потому что я не знал тип любого объекта, который я не знал, к какому типу, который мне нужен чтобы отобразить его. И лучшим решением для меня является листинг объекта Any для NSObject и, например, его свойство className: ((json ["glossary"] as NSDictionary) ["title"] as NSObject) .className это показывает мне "__NSDictionaryM », и, например, на: – Pavel

ответ

12

Как правило, это то, что генерики для. Существует редко веская причина иметь AnyObject в коде, который не взаимодействует с ObjC. Если вы выполняете различные действия на основе типа, вы, вероятно, на самом деле должны использовать перегрузку.

При этом имеется несколько способов получить доступ к типу. Как правило, вы хотите запустить другой код в зависимости от типа, так что вы можете использовать switch для этого:

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

или

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

Или вы можете использовать, если:

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

Подробнее см. «Литье типа для любого и AnyObject» на языке программирования Swift.

Но опять же, если вы не работаете с кодом ObjC, редко можно использовать Any или AnyObject. Дженерики и перегрузки - это инструменты, предназначенные для решения этих проблем в Swift.

0

Первый импорт Фонд

и если вы wan't тип test1 сделать:

var test1 = "test" 

println(_stdlib_getTypeName(test1)) 

вы получите "ЧТС" ЧТС означают строки.

если бы вы попробовать с Int он будет TtSi (я для междунар)

+1

Имейте в виду, что эти имена типов являются частными и могут быть изменены в любое время. Ведущим подчеркиванием имени функции является индикатор от Apple, что это внутренняя функция, которая не предназначена для вызова извне stdlib. –

+0

Использование неразрешенного идентификатора '_stdlib_getTypeName' – Sander

28

Непонятно, что вы подразумеваете под «типом» в своем вопросе. Для любого значения любого типа в Swift, вы можете получить его динамический тип во время выполнения, как это:

theVariable.dynamicType 

Что вы можете сделать с этим еще один вопрос.

версия

Swift 3 с намеком @jojodmo «s:

type(of: theVariable) 
+0

Это должно быть андерсером для этого вопроса. –

+8

В Swift 3, он был изменен на '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

Пожалуйста, добавьте некоторое объяснение. –

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