如何在 Swift 中检查字符串以(前缀)开始还是以(后缀)结束

我试图测试一个 Swift 字符串是以某个值开始还是结束,这些方法都不存在:

var str = "Hello, playground"
str.startsWith("Hello") // error
str.endsWith("ground") // error

我还想得到前缀和后缀字符串。我可以找到一个子字符串,因为是回答 给你给你,但范围是这样一个痛苦的 Swift。

有更简单的方法吗?

(我在阅读 文件的时候偶然发现了这个问题的答案,由于我的搜索条件中没有出现这个问题的答案,所以我在这里添加了我的问答。)

73061 次浏览

Updated for Swift 4

Checking what a String starts with and ends with

You can use the hasPrefix(_:) and hasSuffix(_:) methods to test equality with another String.

let str = "Hello, playground"


if str.hasPrefix("Hello") { // true
print("Prefix exists")
}


if str.hasSuffix("ground") { // true
print("Suffix exists")
}

Getting the Actual Prefix and Suffix Substrings

In order to get the actual prefix or suffix substring, you can use one of the following methods. I recommend the first method for it's simplicity. All methods use str as

let str = "Hello, playground"

Method 1: (Recommended) prefix(Int) and suffix(Int)

let prefix = String(str.prefix(5)) // Hello
let suffix = String(str.suffix(6)) // ground

This is the better method in my opinion. Unlike the methods 2 and 3 below, this method will not crash if the indexes go out of bounds. It will just return all the characters in the string.

let prefix = String(str.prefix(225)) // Hello, playground
let suffix = String(str.suffix(623)) // Hello, playground

Of course, sometimes crashes are good because they let you know there is a problem with your code. So consider the second method below as well. It will throw an error if the index goes out of bounds.

Method 2: prefix(upto:) and suffix(from:)

Swift String indexes are tricky because they have to take into account special characters (like emoji). However once you get the index it is easy to get the prefix or suffix. (See my other answer on String.Index.)

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

If you want to guard against going out of bounds, you can make an index using limitedBy (again, see this answer).

Method 3: subscripts

Since String is a collection, you can use subscripts to get the prefix and suffix.

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

Further Reading

Prefix and Suffix Equality

To check whether a string has a particular string prefix or suffix, call the string’s hasPrefix(:) and hasSuffix(:) methods, both of which take a single argument of type String and return a Boolean value.

Apple Doc