我已经开始学习Swift了。我读到,Swift字符串在使用Cocoa类时被桥接到NSString。这个操作的开销是多少?
来自iOS开发者库
Swift会自动桥接String类型和NSString类。
从Swift源->stdlib/public/core/String.Swift
String
作为NSString
桥接到Objective-C,并且String
源于Objective-C的可能将其字符存储在NSString
。由于NSString
的任意子类都可以如果成为String
,则无法保证代表性或在这种情况下效率。由于NSString
是不可变的,因此它是就像某个副本共享了存储一样:第一个是任何一系列的变异操作都会导致元素被复制转换为唯一的连续存储,这可能会花费O(N)
时间,并且空间,其中N
是字符串表示的长度(或如果基础NSString
具有异常性能特性)。
这些是我从该段得出的结论。注意:NSString
是不可变的,我不确定NSMutableString是如何工作的,这可能与您的具体情况有关。
- 将
NSString
桥接到String
本质上是自由操作;不需要转换。O(1)NSString
使用UTF-16作为后备存储器。String
使用UTF-16或ASCII,因此两个实例可以使用相同的内存
- 但是,如果随后对
String
结构进行突变,则需要从原始NSString
复制所有内存。O(N)String
不能在不修改NSString
的存储器的情况下修改其后备存储器。这就是为什么必须复制内存,以便String
拥有自己的内存
swift使用的支持StringCore的源代码。