How to check what a String starts with (prefix) or ends with (suffix) in Swift

前端 未结 2 484
無奈伤痛
無奈伤痛 2020-12-22 23:31

I\'m trying to test if a Swift string starts or ends with a certain value. These methods do not exist:

var str = \"Hello, playground\"
str.startsWith(\"Hello         


        
相关标签:
2条回答
  • 2020-12-22 23:46

    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

    • Strings and Characters documentation
    0 讨论(0)
  • 2020-12-23 00:00

    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

    0 讨论(0)
提交回复
热议问题