下面的代码编译并在
swift中工作.
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
为什么允许这种类型的铸造?它似乎打破了期望引用类型的函数的合约.
我在重构一些代码以支持值类型时偶然发现了这一点,令我惊讶的是它已经为值类型工作了,即使我认为它不会.依赖这种行为是否安全?
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。