Как определить тип переменной в 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)