Получить тип AnyObject динамически в Swift

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

Ответы

Ответ 1

Обычно это то, что для дженериков. Существует редкость для того, чтобы иметь 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:

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

Для более подробного обсуждения см. "Тип каста для любого и любого объекта" на языке программирования Swift.

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

Ответ 2

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

theVariable.dynamicType

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

версия Swift 3 с @jojodmo:

type(of: theVariable)

Ответ 3

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

и если вы не используете тип test1, выполните следующие действия:

var test1 = "test"

println(_stdlib_getTypeName(test1))

Вы получите "TtSS" TtSS, обозначающую String.

если вы попытаетесь с Int, это будет TtSi (i для int)

Ответ 4

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