Приведенный ниже код компилируется и работает быстро.
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
Почему этот тип кастинга разрешен?Кажется, что он нарушает контракт для функции, которая ожидает ссылочный тип.
Я случайно наткнулся на это при рефакторинге некоторого кода для поддержки типов значений, к моему удивлению, он уже работал для типов значений, дажехотя я думал, что не будет.Безопасно ли полагаться на это поведение?