我试图测试Swift字符串是否以某个值开始或结束。这些方法不存在:
var str = "Hello, playground"
str.startsWith("Hello") // error
str.endsWith("ground") // error
我还想获得前缀和后缀字符串。我可以找到一个子字符串,如here和here所示,但范围在Swift中是如此痛苦。
有更简单的方法吗?
(我在阅读the documentation时偶然发现了答案,而且因为我的搜索条款没有提出答案,所以我在这里添加了我的问答。)< / em>的
答案 0 :(得分:164)
针对Swift 4进行了更新
您可以使用hasPrefix(_:)
和hasSuffix(_:)
方法测试与另一个String的相等性。
let str = "Hello, playground"
if str.hasPrefix("Hello") { // true
print("Prefix exists")
}
if str.hasSuffix("ground") { // true
print("Suffix exists")
}
要获取实际前缀或后缀子字符串,可以使用以下方法之一。我推荐第一种方法,它简单易用。所有方法都使用str
作为
let str = "Hello, playground"
方法1 :(推荐)prefix(Int)
和suffix(Int)
let prefix = String(str.prefix(5)) // Hello
let suffix = String(str.suffix(6)) // ground
在我看来,这是更好的方法。与下面的方法2和3不同,如果索引超出范围,此方法不会崩溃。它将只返回字符串中的所有字符。
let prefix = String(str.prefix(225)) // Hello, playground
let suffix = String(str.suffix(623)) // Hello, playground
当然,有时崩溃很好,因为它们会让您知道您的代码存在问题。因此,请考虑下面的第二种方法。如果索引越界,它将抛出错误。
方法2:prefix(upto:)
和suffix(from:)
Swift String索引很棘手,因为它们必须考虑特殊字符(如表情符号)。但是,一旦获得索引,就很容易获得前缀或后缀。 (请参阅String.Index
上的my other answer。)
let prefixIndex = str.index(str.startIndex, offsetBy: 5)
let prefix = String(str.prefix(upTo: prefixIndex)) // Hello
let suffixIndex = str.index(str.endIndex, offsetBy: -6)
let suffix = String(str.suffix(from: suffixIndex)) // ground
如果您想防止越界,可以使用limitedBy
制作索引(再次参见this answer)。
方法3:下标
由于String是一个集合,您可以使用下标来获取前缀和后缀。
let prefixIndex = str.index(str.startIndex, offsetBy: 5)
let prefix = String(str[..<prefixIndex]) // Hello
let suffixIndex = str.index(str.endIndex, offsetBy: -6)
let suffix = String(str[suffixIndex...]) // ground
答案 1 :(得分:3)
前缀和后缀等式
要检查字符串是否具有特定的字符串前缀或后缀, 调用字符串的hasPrefix( :)和hasSuffix( :)方法 它采用String类型的单个参数并返回一个布尔值 值。