- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
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 字符串进行了优化。
注意:这是来自 master (Swift 5) 分支,早期版本情况可能有所不同。
关于Swift:String starts(with:) vs hasPrefix,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54807543/
在我的代码中,我有这样的基准: const STR = "abcd" const PREFIX = "ab" var STR_B = []byte(STR) var PREFIX_B = []byte
为什么以下总是打印不正确的“prefix”,但当 String 不是可选的或隐式解包可选时打印“无前缀”? var value:String! = "aaa" // Same incorrect b
我想避免在下面的示例代码中使用 if 语句,而是对我的号码字符串调用 hasPrefix 并传入 前缀 数组。有没有办法在 Swift 中做到这一点? let prefixes: [String] =
我有一个字典数组,我尝试使用以下键之一使用前缀进行过滤: let b = [["id":1,"name":"India"],["id":2,"name":"america"],["id":3,"nam
String.hasPrefix (或 [NSString hasPrefix])一直是 Foundation 的一部分。但是,我刚刚注意到现在我们也有 starts(with:) . 此方法来自 S
很简单,可能会问很多次,但这个没什么技巧。我们知道,NSString 在 hasPrefix: 方法中不区分大小写。 NSString *string = @"Xyzabcdedfghij";
在我的项目中,我需要一个字符串项的预定义前缀或后缀列表,它可以是前缀或后缀,这样我就可以遍历这些项并检查每个项的前缀或后缀,只是想知道哪个更便宜?感觉 hasPrefix: 比较便宜,但我没有任何引用
在 Swift2 中,您可以使用类似于以下代码的内容: switch productIdentifier { case hasSuffix("q"): return "
我在 Unity 中制作了一款游戏,并为 iOS 设备构建了它。客户问我们是否可以在游戏中实现 WebTrends,所以我关注了 this getting started guide有关如何安装它的说
我是一名优秀的程序员,十分优秀!