String.hasPrefix(和[NSString hasPrefix])始终存在。我刚刚注意到,现在我们还有starts(with:)
。
此方法来自Sequence
,但它也适用于String
。
我的问题是,我应该选择哪一个?有性能方面的考虑吗?我从Objective-C的日子开始习惯hasPrefix
,但是starts(with:)
更直观,可以用于其他序列。
答案 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)分支的,情况可能与早期版本有所不同。