Swift:String start(with :) vs hasprefix

noa*_*mtm 5 string swift

String.hasPrefix(和[NSString hasPrefix])总是在那里.我刚注意到,现在我们也有了starts(with:).

这种方法来自Sequence但也适用于String.

我的问题是,我应该选择哪一个?有任何性能考虑因素吗?我习惯于hasPrefix从Objective-C开始,但starts(with:)更直观,适用于其他序列.

Mar*_*n R 9

String.hasPrefix()StringLegacy.swift中实现为

extension String {

  public func hasPrefix(_ prefix: String) -> Bool {
    if _fastPath(self._guts.isNFCFastUTF8 && prefix._guts.isNFCFastUTF8) {
      guard prefix._guts.count <= self._guts.count else { return false }
      return prefix._guts.withFastUTF8 { nfcPrefix in
        let prefixEnd = nfcPrefix.count
        return self._guts.withFastUTF8(range: 0..<prefixEnd) { nfcSlicedSelf in
          return _binaryCompare(nfcSlicedSelf, nfcPrefix) == 0
        }
      }
    }

    return starts(with: prefix)
  }

}
Run Code Online (Sandbox Code Playgroud)

这意味着(如果我理解正确的话):如果字符串和前缀候选者都使用基于UTF-8的存储,则直接比较UTF-8字节.否则它会回落starts(with:)并进行Character基础比较.

因此结果没有区别,但hasPrefix()针对原生Swift字符串进行了优化.

注意:这是来自master(Swift 5)分支,在早期版本中情况可能不同.