Как определить тип переменной в Swift
Есть ли функция для определения типа переменной в Swift? Я предполагаю, что в Python может быть что-то вроде type()
.
Мне бы хотелось судить, является ли переменная объектом Foundation или переменной C в Swift. Как и NSString vs String, или NSArray vs array. Чтобы я мог вывести его на консоль и четко видеть, что это такое.
Например, мне бы хотелось узнать тип, следующий для первого array
ниже:
var array = [1,2,3] // by default NSArray or array?
var array:[Int] = [1,2,3]
var array:NSArray = [1,2,3]
var array:Array<Any> = [1,2,3]
Я видел ответы для оценки того, является ли данная переменная типом данного типа в этом вопросе, но я скажу, что это совсем не то, что я хочу спросить.
Ответы
Ответ 1
Вы можете получить ссылку на объект типа значения с помощью свойства .dynamicType
. Это эквивалентно функции Python type()
и упоминается в документации Swift в разделе Reference Language: Типы: Тип метатипа.
var intArray = [1, 2, 3]
let typeOfArray = intArray.dynamicType
С этим типом объекта мы можем создать новый экземпляр того же типа массива.
var newArray = typeOfArray()
newArray.append(5)
newArray.append(6)
println(newArray)
[5, 6]
Мы можем видеть, что это новое значение имеет один и тот же тип ([Int]
), пытаясь добавить float:
newArray.append(1.5)
error: type 'Int' does not conform to protocol 'FloatLiteralConvertible'
Если мы импортируем Cocoa и используем литерал массива со смешанными типами, мы видим, что создается NSArray
:
import Cocoa
var mixedArray = [1, "2"]
let mixedArrayType = mixedArray.dynamicType
var newArray = mixedArrayType()
var mutableArray = newArray.mutableCopy() as NSMutableArray
mutableArray.addObject(1)
mutableArray.addObject(1.5)
mutableArray.addObject("2")
println(mutableArray)
(1, "1.5", 2)
Однако на данный момент не существует общего способа генерации описания строки объекта типа, поэтому это может не служить той ролью отладки, о которой вы просили.
Типы, полученные из NSObject
, имеют метод .description()
, который используется в ответе SiLo,
println(mixedArrayType.description())
__NSArrayI
Однако этого нет в таких типах, как встроенные в Swift массивы.
println(typeOfArray.description())
error: '[Int].Type' does not have a member named 'description'
Ответ 2
+ щелкните переменную, которую вы хотите изучить.
![enter image description here]()
Ответ 3
Это можно сделать, хотя это не обязательно так просто и полезно:
func getClassName(obj : AnyObject) -> String
{
let objectClass : AnyClass! = object_getClass(obj)
let className = objectClass.description()
return className
}
let swiftArray = [1, 2, 3]
let swiftDictionary = ["Name": "John Doe"]
let cocoaArray : NSArray = [10, 20, 30]
var mutableCocoaArray = NSMutableArray()
println(getClassName(swiftArray))
println(getClassName(swiftDictionary))
println(getClassName(cocoaArray))
println(getClassName(mutableCocoaArray))
Вывод:
_TtCSs22ContiguousArrayStorage00007F88D052EF58
__NSDictionaryM
__NSArrayI
__NSArrayM
Лучше использовать ключевые слова is
и as
в Swift. Многие классы фундамента используют кластеры классов (как вы можете видеть с помощью __NSArrayI
(неизменяемый) и __NSArrayM
(изменяемый).
Обратите внимание на интересное поведение. swiftArray
по умолчанию используется Swift Array<Int>
, а swiftDictionary
по умолчанию - NSMutableDictionary
. При таком поведении я бы не стал полагаться на то, что было определенным типом (сначала проверьте).
Ответ 4
Кто-то упомянул об этом выше, но я думаю, что он заслуживает видимости в качестве ответа, а не комментария. Теперь вы можете просто использовать тип (из: ___):
var red, green, blue: Double
print(type(of: green))
дает
Double
Ответ 5
Я использую точки останова во время отладки, но если вам нужно проверить, соответствуют ли они определенному типу во время выполнения, тогда drewag прав
еще одна вещь, которую вы можете сделать, это проверить тип данных с утверждением, что это будет работать только при отладке, но с утверждением вы можете установить условия, которые, если встретили приложение, сбой
может быть что-то вроде assert(let tArray == oldArray as? NSArray[] //if not NSArray app crashes)