Swift:字符串开始(with :) vs hasprefix

时间:2019-02-21 12:52:08

标签: swift string

String.hasPrefix(和[NSString hasPrefix])始终存在。我刚刚注意到,现在我们还有starts(with:)

此方法来自Sequence,但它也适用于String

我的问题是,我应该选择哪一个?有性能方面的考虑吗?我从Objective-C的日子开始习惯hasPrefix,但是starts(with:)更直观,可以用于其他序列。

1 个答案:

答案 0 :(得分: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)
  }

}

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

因此结果没有差异,但是hasPrefix()已针对本机Swift字符串进行了优化。

注意:这是来自master(Swift 5)分支的,情况可能与早期版本有所不同。