bridgeToObjectiveC是否真的必要?

4

在Swift中,将String转换为NSString是否真的需要使用bridgeToObjectiveC()呢?bridgeToObjectiveC()的行为是什么?根据我所读到的许多地方,实际上不需要使用bridgeToObjectiveC(),因为将Swift String转换为NSString是隐式的。

3个回答

3
如果您导入 Foundation 框架,那么 Swift 的 String 类型和 NSString 类型之间的类型转换是隐式的。如果使用了 import Foundation ,则无需使用 bridgeToObjectiveC() 来处理字符串。根据Swift的文档

Swift 自动实现了 String 类型和 NSString 类型之间的桥接。这意味着,在任何需要使用 NSString 对象的地方,您都可以使用 Swift 的 String 类型,并获得这两种类型的优点——String 类型插值和基于 Swift 设计的 API,以及 NSString 类的广泛功能。因此,在自己的代码中几乎不需要直接使用 NSString 类。实际上,当 Swift 导入 Objective-C API 时,它使用 String 类型替换了所有的 NSString 类型。当 Objective-C 代码使用 Swift 类时,导入器会将所有的 String 类型替换为导入的 API 中的 NSString。

要启用字符串桥接,只需导入 Foundation。

但在某些情况下,默认的桥接可能无法正常工作,例如,您无法检查字符串的长度。
var abcs = "somString"
abcs.length //will not work

abcs.bridgeToObjectiveC().length //you need call `bridgeToObjectiveC` explicitly

对于这种情况,默认的桥接方式将不起作用。


在Swift中最好使用countElements(abcs)或者abcs.utf16count,因为它们不需要桥接。 - Keenle
是的,你可以这样做,它们不是 NSString 函数。我想要展示在某些情况下我们需要显式定义 bridgeToObjectiveC,因为隐式转换可能无法工作。 - codester
没有关于你的代码和答案的问题。只是想把它作为评论放在这里,以便初学者可以轻松地看到如何处理字符串。 - Keenle

0

在Swift 2.2中不可用bridgeToObjectiveC()。

请改用:_bridgeToObjectiveC()

例如:

var temp: String = "hello"
print(temp._bridgeToObjectiveC().length)

0

它应该是隐式的,但有很多地方不是。字符串、数组和字典缺少一些Obj-C对应标量操作,例如String.length


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接