如何简洁地访问给定`Index`的`String`s?

时间:2016-08-11 12:57:46

标签: swift string indexing swift3

在Swift 3中SE-0065更改了Collection s的索引模型,其中索引遍历的责任从索引移动到集合本身。例如,不是写i.successor(),而是写c.index(after: i)

这对于在特定索引处访问String而言意味着什么,而不是写这个:

let aStringName = "Bar Baz"
aStringName[aStringName.startIndex.advancedBy(3)]

......我们现在必须写下这个:

aStringName[aStringName.index(aStringName.startIndex, offsetBy: 3)]

这似乎非常多余,因为提到了aStringName三次。所以我的问题是,是否有办法解决这个问题(除了编写String的扩展名外)?

2 个答案:

答案 0 :(得分:5)

对于未来的Google员工,我在下面发布了我的String扩展程序。它允许您使用Int而不是繁琐的Index来访问字符串:

extension String {
    subscript(index: Int) -> Character {
        let startIndex = self.index(self.startIndex, offsetBy: index)
        return self[startIndex]
    }

    subscript(range: CountableRange<Int>) -> String {
        let startIndex = self.index(self.startIndex, offsetBy: range.lowerBound)
        let endIndex = self.index(startIndex, offsetBy: range.count)
        return self[startIndex..<endIndex]
    }

    subscript(range: CountableClosedRange<Int>) -> String {
        let startIndex = self.index(self.startIndex, offsetBy: range.lowerBound)
        let endIndex = self.index(startIndex, offsetBy: range.count)
        return self[startIndex...endIndex]
    }

    subscript(range: NSRange) -> String {
        let startIndex = self.index(self.startIndex, offsetBy: range.location)
        let endIndex = self.index(startIndex, offsetBy: range.length)
        return self[startIndex..<endIndex]
    }
}

let str = "Hello world"

print(str[0])                   // Get the first character
print(str[0..<5])               // Get characters 0 - 4, with a CountableRange
print(str[0...4])               // Get chacraters 0 - 4, with a ClosedCountableRange
print(str[NSMakeRange(0, 5)])   // For interacting with Foundation classes, such as NSRegularExpression

答案 1 :(得分:0)

如果不编写扩展名,似乎没有简洁明了的方法可以做到这一点。这种扩展的版本可能如下所示:

extension String {
  subscript(offset offset: Int) -> Character {
    return self[index(startIndex, offsetBy: offset)]
  }
}