Как понять, является ли экземпляр типом значения или ссылочным типом?
ОПИСАНИЕ:
Прежде всего, я прочитал о 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.
Все равно спасибо за внимание
AnyObject
в Swift 3. Вещи, которые не могут быть напрямую представлены в Obj-C (например,MyStruct
), помещаются в непрозрачную совместимую с Obj-C коробку,_SwiftValue
. Ссылкаweak
на это должна подойти, хотя, поскольку в вашем примере вы делаете упаковку в задании, она будет немедленно освобождена. - person Hamish   schedule 05.04.2017