Я передал параметр функции типа AnyObject, потому что все может быть передано ему. Есть ли способ получить динамический тип передаваемого объекта?
Получить тип AnyObject динамически в Swift
Ответ 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")
}
}