Swift字符串常用操作

swift 中关于取子串有4 个方法

str.index(after: String.Index)
str.index(before: String.Index)
str.index(String.Index, offsetBy: String.IndexDistance)
str.index(String.Index, offsetBy: String.IndexDistance, limitedBy: String.Index)

分别是什么, 该如何使用?
下面来看看
本例中, 我们创建一个字符串"Hello, playground" , 如下

var str = "Hello, playground"

字符索引

startIndex 和 endIndex

  • startIndex 是第一个字符的索引, 也就是
  • endIndex 是最后一个字符索引 +1
// character
str[str.startIndex] // H
str[str.endIndex]   // error: after last character

// range
let range = str.startIndex ..< str.endIndex
str[range]  // "Hello, playground"

after

index(after: String.Index)
after 指向给定索引后面的一个索引(类似与 + 1)

// character
let index = str.index(after: str.startIndex)
str[index]  // "e"

// range
let range = str.index(after: str.startIndex)..<str.endIndex
str[range]  // "ello, playground"

before

index(before: String.Index)
before 指向给定索引之前的一个索引(类似与 - 1)

// character
let index = str.index(before: str.endIndex)
str[index]  // d

// range
let range = str.startIndex ..< str.index(before: str.endIndex)
str[range]  // Hello, playgroun

offsetBy

index(String.Index, offsetBy: String.IndexDistance)
offsetBy 的值可以为正或是负, 正则表示向后, 负则相反.别被offsetBy 的 String.IndexDistance 类型吓到, 本身其实是一个 Int.(类似于+n 和 -n)

// character
let index = str.index(str.startIndex, offsetBy: 7)
str[index] // p

// range
let start = str.index(str.startIndex, offsetBy: 7)
let end = str.index(str.endIndex, offsetBy: -6)
let range = start ..< end
str[range] // play

limitedBy

index(String.Index, offsetBy: String.IndexDistance, limitedBy: String.Index)

limitedBy 在 offset 过大导致溢出错误的时候很有用.这个返回值是一个可选值, 如果 offsetBy 超过了 limitBy, 则返回 nil.

// character
if let index = str.index(str.startIndex, offsetBy: 7, limitedBy: str.endIndex) {
str[index] // p
}

上面这段代码中如果offset 设置为 77, 返回值就是 nil, if 中的代码就会跳过

所以如果你要取子串的正确姿势是什么?


  • 取某个位置之后的所有字符
    str.substring(from: str.index(str.startIndex, offsetBy: 7)) // playground

  • 取倒数某个位置之后的所有字符
    str.substring(from: str.index(str.endIndex, offsetBy: -10)) //playground

  • 取某个位置之前的所有字符
    str.substring(to: str.index(str.startIndex, offsetBy: 5)) //Hello

  • 取倒数某个位置之前的所有字符
    str.substring(to: str.index(str.endIndex, offsetBy: -12)) //Hello

  • 取中间的某个字符串
    str.substring(with: str.index(str.startIndex, offsetBy: 7) ..< str.index(str.endIndex, offsetBy: -6)) // play