在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
的扩展名外)?
答案 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)]
}
}