当前位置: 首页 > 面试题库 >

为什么将结构强制转换为AnyObject而不是迅速的编译错误?

阎阳
2023-03-14
问题内容

下面的代码可以快速编译和运行。

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

为什么允许这种类型的铸造?似乎期望引用类型的函数违反了约定。

在重构一些代码以支持值类型时,我偶然发现了这一点,令我惊讶的是,即使我认为这样做对值类型也已经起作用。依靠这种行为是否安全?


问题答案:

这是有助于传递给可可粉的功能。任何结构都可以包装成SwiftValue引用类型。如果您进行打印type(of: object),则会看到包装纸。

我认为没有任何“期望参考类型”的合同。更重要的是,尽管在Swift中存在“值类型”和“引用类型”,但真正重要的是值和引用 语义
,它们在语言中无法表达。您可以在引用类型中创建值语义,而在值类型中创建引用语义,因此Swift类型系统在这方面实际上没有任何帮助。

这里的重点是,仅当您通过请求明确请求时,才会得到这种异常行为as AnyObject。写下它的理由很少,如果是这样,则最好确切地知道自己在做什么。



 类似资料:
  • 问题内容: 我有那个代码 有时,强制转换为无效。当我看到。为什么会这样呢?我使用来自GitHub的SwiftSocket库。对不起我的英语不好。 当我的服务器发送大字符串时会发生这种情况。例如- 如果我收到一个消息对象(我的班级)-一切都会正常。但是,如果我收到4,5,6,…消息对象(我的班级),这有时会起作用。MAGIC :( 新版本的代码 问题答案: 注意:我不会讲Swift。以下代码可能无法

  • 问题内容: 执行此强制转换时出现编译错误: 应该被继承,尽管不能直接继承。 从文档: 农具其中inturn & 为什么这无效? 也感谢您提供有关使用as 的正确方法的意见? 我正在考虑包装方法。 问题答案: 扩展,并且 不 扩展。 如果您想从中获得帮助,我认为实现包装器类是您最简单的选择。幸运的是的唯一抽象方法是。 RandomAccessFile实现了DataInput,该数据输入将依次转为Da

  • 问题内容: 为什么在下面的代码中没有出现编译错误?我得到一个有点混乱的地方。是因为它们有关系吗? 问题答案: 为什么在下面的代码中没有出现编译错误? 因为编译器只关心您要强制转换的表达式的静态类型。 看这两行: 您 知道在第二行中,由于第一行,该值仅引用类型的对象,而编译器则没有。对于所有的编译器知道(编译第二线时),它 可能 实际上已经: …哪里有扩展和实现的类。因此它是有效的(在编译时),以铸

  • 问题内容: 所以这工作: 但这不是: 总而言之,我得到了第一部分(拳击),但是我发现第二部分不起作用是非常不直观的。是否有特定的原因(除了String从Object继承而int不从Object继承)? 编辑: 为了完善我的问题,这也可以: 但是,以下内容却没有: 令人惊讶的是,您遇到了与String相同的问题: 在最后一行产生类强制转换异常。仍然有效: 问题答案: 我刚刚找到了我正在寻找自己的答案

  • 我认为的意思是不能大于8位的容量。0B1111_1111是8位。

  • 有一个不希望的C样式强制转换,我无法防止编译。不需要的强制转换执行从某个类的对象到其他类的非常量引用的C样式强制转换。这些类是不相关的。同时,我喜欢支持从同一个类的对象到常量引用的C样式转换。我提供了一个公共转换操作符来支持理想的强制转换。在这种情况下,似乎无法防止不希望的强制转换。 对非常量引用的强制转换未能生成(“Sandbox::B::操作符Sandbox::A&()”(在第30行声明)不可