Swift 和 Objective-C 是不是共享相同的原生 API?

Posted

技术标签:

【中文标题】Swift 和 Objective-C 是不是共享相同的原生 API?【英文标题】:Do Swift and Objective-C share the same native API?Swift 和 Objective-C 是否共享相同的原生 API? 【发布时间】:2014-06-04 17:11:50 【问题描述】:

由于我的 Apple 帐户在另一个国家/地区注册,因此我无法使用 Apple 的电子书,但我想知道是否有人知道 Objective-C 和 Swift 是否共享相同的本地 API?还是 Swift 是一个完全“新”的东西?

【问题讨论】:

The Swift Programming Language, Using Swift with Cocoa and Objective-C 【参考方案1】:

Swift 有自己的 API 用于基本类(如 Array 和 Dictionary),但它也可以访问整个 Objective-C 代码库,如 UIKit、Cocoa 和 Foundation。

【讨论】:

【参考方案2】:

有点漫不经心的答案,但我从书中学到了一些东西:

Swift 是静态类型的。它不在下面使用objc_msgSend。 Apple 提供了两者之间的桥梁,以使任何一种语言的类都可以从另一种语言中调用,但在它之下,调用函数的方式非常不同。

公开的 API 描述了相同的系统——一个具有屏幕和窗口、视图和视图控制器、故事板和 segue、StoreKit、CoreLocation 等的应用程序——但结果不同。你会说它们在多大程度上是相同的 API 是没有实际意义的。

泛型现在是一种语言功能。有了这个和严格的类型,集合现在是类型化的,看起来很像 STL 泛型;例如你声明了一个带有Int 类型键和String 类型值的字典,并尝试将任何其他类型的键/值对放入其中会引发运行时异常。

Swift 通过变量和常量之间的区别,将可变事物和不可变事物之间的区别提升到新的值类型类别的语言级别。这会自动将区别扩展到 Foundation 集合。因此,有了这些,就不再需要手动管理 copymutableCopy(相对于 retain,无论 ARC 是隐含的还是显式的)。

因为语言不是动态的,所以 Cocoa 的支柱如键值观察不可用。

Swift 遵循 C# 在结构与类方面的领先优势——结构可以有方法但存在于堆栈中。由于块是一个值得注意的特殊情况,Objective-C 对象不能存在于堆栈中。这对数据如何流动的务实思考产生了一些影响。

Swift 有一个语言级别的元组概念,它就像一个数组和一个类的混合体。它允许将有序或命名字段组合成一个单元,但旨在用于受限的就地使用,例如指示返回结果不值得定义另一个类的权重。这自然会影响 API。

所有类型的变量——包括那些通常会像 C 原语一样编译的变量——现在都可以是可选的。 nil 可以分配给任何可选变量以表示它当前没有值。它不能分配给任何非可选的变量。所以NSNotFound等都不见了。

【讨论】:

“Swift 通过变量和常量之间的区别将可变事物和不可变事物之间的差异提升到了语言级别。”也许对于值类型。但是无论如何,值类型的可变/不可变几乎没有意义。对值类型的任何更改在语义上都等同于分配一个新值。对于引用类型(类实例的引用),变量是否可赋值与指向的对象是否可变无关。 @newacct 另一方面:“如果您创建一个数组或字典并将其分配给一个变量,则创建的集合将是可变的。...相反,如果您分配一个数组或将字典转换为常量,该数组或字典是不可变的,其大小无法更改。";这些类型之间的可变/不可变差异在框架(/API)级别处理,现在在语言级别处理。因此,我坚持我的声明,适用于 Swift 是否按照要求“共享相同的原生 API”。 那只是因为ArrayDictionary 是结构体,它们是值类型。它不适用于引用(指向对象的指针)类型,包括指向 Cocoa 对象的指针。因此,您所说的这些东西,“不仅仅是 Foundation 集合。不再需要手动管理副本与 mutableCopy(与保留相比,无论 ARC 是隐含的还是显式的)。”是错误的,因为它不适用于 Foundation 集合,需要区分copymutableCopy @newacct 我认为你是对的,我错了,所以我尝试了更正。由于我相信更正的意义足以使其不再是 my 答案,因此我已将其标记为社区 wiki。希望现在那里的内容更准确(放弃例如一些块存在于堆栈中,因此从技术上讲,引用/值的区别也在 Objective-C 中,但是以非常有限的方式(并且,是的,我正在为语义打折标记指针原因))。

以上是关于Swift 和 Objective-C 是不是共享相同的原生 API?的主要内容,如果未能解决你的问题,请参考以下文章

如何创建符合 Swift 和 Objective-C 之间共享协议的类方法?

使用 Objective-C/Swift 单例模型,为啥我们要创建共享实例而不只是使用类方法? [复制]

在组合项目中从Swift类访问Objective-C类中的singleton sharedInstance

AudioUnit Render 回调中的 Objective-C/Swift 用法

Swift 代码是不是在底层变成了优化的 Objective-C 代码?

在视图控制器上不显示视图控制器 - Swift / Objective-C