基于Sequence初始化Swift String的时间复杂度是多少?
已完成的工作
- 查阅了该初始化方法的官方文档。
- 查阅了对应开源代码,如下所示。
细节说明
查看方法定义后,我进一步明确了以下结论:传入的Sequence/Array会以连续字节形式存储,并且采用UTF8编码。
/// 使用指定编码,将给定的Unicode代码单元创建为字符串。 /// /// - 参数: /// - codeUnits: 一组以`sourceEncoding`指定编码格式存储的代码单元。 /// - sourceEncoding: 解析`codeUnits`时使用的编码类型。 @inlinable @inline(__always) // 尽可能消除动态类型检查 public init<C: Collection, Encoding: Unicode.Encoding>( decoding codeUnits: C, as sourceEncoding: Encoding.Type ) where C.Iterator.Element == Encoding.CodeUnit { guard _fastPath(sourceEncoding == UTF8.self) else { self = String._fromCodeUnits( codeUnits, encoding: sourceEncoding, repair: true)!.0 return } // 针对自定义集合和类型化连续集合的快速路径 // // 注:将此分支放在前面是因为优化器通常能识别`withContiguousStorageIfAvailable`, // 但无法证明某个类型没有遵循`_HasContiguousBytes`协议。 if let str = codeUnits.withContiguousStorageIfAvailable({ (buffer: UnsafeBufferPointer<C.Element>) -> String in Builtin.onFastPath() // 鼓励SIL优化器内联此闭包 :-( let rawBufPtr = UnsafeRawBufferPointer(buffer) return String._fromUTF8Repairing( UnsafeBufferPointer( start: rawBufPtr.baseAddress?.assumingMemoryBound(to: UInt8.self), count: rawBufPtr.count)).0 }) { self = str return } // 针对无类型原始存储和标准库已知类型的快速路径 if let contigBytes = codeUnits as? _HasContiguousBytes, contigBytes._providesContiguousBytesNoCopy { self = contigBytes.withUnsafeBytes { rawBufPtr in Builtin.onFastPath() // 鼓励SIL优化器内联此闭包 return String._fromUTF8Repairing( UnsafeBufferPointer( start: rawBufPtr.baseAddress?.assumingMemoryBound(to: UInt8.self), count: rawBufPtr.count)).0 } return } self = String._fromNonContiguousUnsafeBitcastUTF8Repairing(codeUnits).0 }
内容的提问来源于stack exchange,提问作者3366784
相关产品推荐
相关产品推荐

