String.hasPrefix(和[NSString hasPrefix])总是在那里.我刚注意到,现在我们也有了starts(with:).
这种方法来自Sequence但也适用于String.
我的问题是,我应该选择哪一个?有任何性能考虑因素吗?我习惯于hasPrefix从Objective-C开始,但starts(with:)更直观,适用于其他序列.
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)分支,在早期版本中情况可能不同.