Как отличить класс в Swift 3.0 (чтобы быть уверенным, что это не структура или перечисление)

Как понять, является ли экземпляр типом значения или ссылочным типом?

ОПИСАНИЕ:

Прежде всего, я прочитал о AnyObject в документацию.

Swift предоставляет два специальных типа для работы с неспецифическими типами:

  • Any может представлять экземпляр любого типа, включая типы функций.:

  • AnyObject может представлять экземпляр любого типа класса.

Используйте Any и AnyObject только тогда, когда вам явно нужны поведение и возможности, которые они предоставляют. Всегда лучше быть конкретным в отношении типов, с которыми вы собираетесь работать в своем коде.

Поэтому я решил написать простой код на своей игровой площадке:

struct MyStruct {
    var x = 5
}

let testStruct = MyStruct()

testStruct is AnyObject

if let object = testStruct as? AnyObject {
    //Do something
}

И я был в шоке, когда увидел 2 предупреждения.

  • проверка "есть" всегда верна
  • Условное приведение от «MyStruct» к «AnyObject» всегда завершается успешно.testStruct is AnyObject

введите здесь описание изображения

Даже больше... Я смог установить для своей структуры слабое свойство.

class TestClass {
    
    weak var object: AnyObject?
    
}

var instance: TestClass? = TestClass()


instance?.object = testStruct as AnyObject

И я не видел никаких предупреждений или ошибок там. Приведет ли это к сбою или неопределенному поведению? Мне это кажется странным...

Также я упомянул типы на игровой площадке.

  • тип (из: testStruct as AnyObject) - _SwiftValue.Type
  • тип (из: testStruct) - MyStruct.Type

Вероятно, testStruct был неявно преобразован в класс. Но я не уверен в этом, и не могу найти никакой информации об этом в Интернете =(

Вы когда-нибудь читали что-нибудь об этом? Или вы можете дать мне ссылку на документацию, чтобы понять, что происходит. Наверное, я упустил что-то очень важное.

  • Версия Swift: Apple Swift версии 3.0.2 (swiftlang-800.0.63 clang-800.0.42.1)
  • Версия XCode: 8.2.1 (8C1002)

P.S.

Я должен подчеркнуть, что он отлично работает (как я думаю) в Swift 2.0.

Все равно спасибо за внимание


person Nuzhdin Vladimir    schedule 05.04.2017    source источник
comment
Сравните AnyObject, не работающий в Xcode8 beta6? (обман?) - все можно подключить к AnyObject в Swift 3. Вещи, которые не могут быть напрямую представлены в Obj-C (например, MyStruct), помещаются в непрозрачную совместимую с Obj-C коробку, _SwiftValue. Ссылка weak на это должна подойти, хотя, поскольку в вашем примере вы делаете упаковку в задании, она будет немедленно освобождена.   -  person Hamish    schedule 05.04.2017


Ответы (1)


Краткий ответ:

type(of: value) is AnyClass
person Nuzhdin Vladimir    schedule 05.04.2017