Почему приведение структуры к AnyObject не является ошибкой компиляции в swift? - PullRequest
0 голосов
/ 27 января 2019

Приведенный ниже код компилируется и работает быстро.

struct TestStruct {
    let value: String = "asdf"
}

func iWantAReferenceType(object: AnyObject) {
    print(String(describing: object))
}

let o: TestStruct = TestStruct()

iWantAReferenceType(object: o as AnyObject)

Я ожидал, что это будет ошибка компиляции, потому что структура никогда не может соответствовать AnyObject.Как показано ниже в коде, который не компилируется.

protocol Test: AnyObject {

}

//Compile error: because a struct cannot be AnyObject
struct TestStruct: Test {
    let value: String = "asdf"
}

Я знаю, что для некоторых типов, таких как String, может происходить какое-то мостовое соединение.Это преобразует тип значения ссылочного типа.

print(Mirror(reflecting: "asdf").subjectType) //print: String
print(Mirror(reflecting: "asdf" as AnyObject).subjectType) //print: NSTaggedPointerString

При написании этого вопроса я подумал посмотреть, каким был тип объекта приведения, и кажется, что он также каким-то образом соединен.

print(Mirror(reflecting: o).subjectType) //prints: TestStruct
print(Mirror(reflecting: o as AnyObject).subjectType) //prints: _SwiftValue

Почему этот тип кастинга разрешен?Кажется, что он нарушает контракт для функции, которая ожидает ссылочный тип.

Я случайно наткнулся на это при рефакторинге некоторого кода для поддержки типов значений, к моему удивлению, он уже работал для типов значений, дажехотя я думал, что не будет.Безопасно ли полагаться на это поведение?

1 Ответ

0 голосов
/ 27 января 2019

Эта функция облегчает переход в Какао.Любая структура может быть заключена в ссылочный тип SwiftValue.Если вы напечатаете type(of: object), вы увидите упаковщик.

Я не думаю, что существует какой-либо контракт на «ожидание ссылочного типа».Что еще более важно, хотя в Swift существуют «типы значений» и «ссылочные типы», на самом деле важно значение и справочная информация семантика , которые не выражаются в языке.Вы можете создавать семантику значений в ссылочных типах и семантику ссылок в типах значений, поэтому система типов Swift действительно не поможет в этом отношении.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...