【问题标题】:What is the difference between Swift structs and Objective-C structs?Swift 结构和 Objective-C 结构有什么区别?
【发布时间】:2019-03-17 23:48:25
【问题描述】:

在我的第一次工作面试中,有人问我 Swift 结构和 Objective-C 结构有什么区别。

谁能深入解释这种差异?任何帮助将不胜感激。

【问题讨论】:

  • 世界上所有的差异。
  • @matt 感谢您的回复 :-) 这是一个模棱两可的小问题吗?...你能提示一下吗?
  • 这是一个愚蠢的问题,但我猜面试官想听听一些关于价值与参考类型的事情。
  • @datell 我也这么认为。但我认为内部或功能可能存在一些差异。我认为它可以在从 Objective-C 遗留代码移植到 Swift 代码时使用。

标签: objective-c swift struct


【解决方案1】:

Objective-C 结构是 C 结构,而 C 结构只是一块内存,其偏移量由结构属性定义。所以,如果一个结构有三个int 属性,x, y, z,我们知道 x 只是“结构的开头”的别名,y 只是“在结构”,而 z 只是“结构开始后的一些其他字节数”的别名。如果 C 结构是本地(自动)变量,则可以将其存储在堆栈中,或者可以通过调用 malloc 并使用结构指针来引用该内存来将其存储在堆中。 C 结构是一种非常原始的类型。同样,ObjC 结构只是 C 结构。没有区别。 (事实上​​,这就是你 can't put ARC-managed objects into a struct 的原因;它们只是 C 结构,而 ARC 无法处理。)

Swift 结构是完全不同的野兽。它们通常仍以内存块的形式实现,无论是在堆栈上还是在具有偏移到内存块中的属性的堆上,但这主要只是一个实现细节。 Swift 结构是丰富的类型,可以具有方法、扩展、符合协议以及大多数其他人们可能期望在类型丰富的语言中作为高级类型的东西。

最重要的是,Swift 结构不仅仅是像 C 结构那样的“记忆双关语”。您可以将不同的 C 结构指向同一内存,并以不同的方式读取它(联合当然可以做到这一点,但您也可以直接使用结构来做到这一点)。没有规定底层内存块的大小与 C 中的结构相同(例如,这就是 objc_object 的工作方式)。但是 Swift 结构不允许这种内存别名。他们更直接地“拥有”他们的记忆。如果你想弄乱他们的内部记忆,你必须通过某种“不安全”的界面。您不能只将 4 添加到指针并获取任何值,例如 C 结构。

由于所有这些,您可以将 ARC 管理的对象存储在 Swift 结构中(事实上,这一直在 stdlib 中完成。)

所以是的,完全不同的小动物,尽管有相同的名字。真正相同的一件事是它们都是具有属性的值类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多