String.hasPrefix
(或 [NSString hasPrefix]
)一直是Foundation的一部分。 但是,我刚刚注意到现在我们也有starts(with:)
。
这个方法来自于Sequence
,但同样适用于String
。
我的问题是,我应该选择哪一个? 是否存在任何性能考虑因素? 我习惯了 Objective-C 时代的 hasPrefix
,但 starts(with:)
更直观,并且适用于其他序列。
String.hasPrefix
(或 [NSString hasPrefix]
)一直是Foundation的一部分。 但是,我刚刚注意到现在我们也有starts(with:)
。
这个方法来自于Sequence
,但同样适用于String
。
我的问题是,我应该选择哪一个? 是否存在任何性能考虑因素? 我习惯了 Objective-C 时代的 hasPrefix
,但 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)
}
}
如果我理解正确,这意味着:如果字符串和前缀候选字串都使用基于UTF-8的存储,则直接比较UTF-8字节。否则,它会回退到starts(with:)
并进行基于Character
的比较。hasPrefix()
针对原生的Swift字符串进行了优化。
starts(with:)
的文档应该建议使用hasPrefix
代替)。而且它实现在StringLegacy.swift中这一事实令人怀疑。 - noamtmstarts(with:)
实现,那将更有意义。 - noamtmString.start(with:)
的文档可能是从通用序列方法(String符合该方法)自动生成的。-我理解您对文件名的担忧,但我不知道它背后的意图。 - Martin R