You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 00:06:23