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

Mar*_*sel 0 string indexing swift swift3

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

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

let aStringName = "Bar Baz"
aStringName[aStringName.startIndex.advancedBy(3)]
Run Code Online (Sandbox Code Playgroud)

......我们现在要写这个:

aStringName[aStringName.index(aStringName.startIndex, offsetBy: 3)]
Run Code Online (Sandbox Code Playgroud)

这看起来非常多余,正如aStringName所提到的那样.所以我的问题是,如果有办法绕过这个(除了写一个扩展String)?

Cod*_*ent 5

对于未来的Google员工,我在String下面发布我的扩展程序.它允许您使用Ints而不是繁琐的方式访问字符串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
Run Code Online (Sandbox Code Playgroud)