在swift 3中,你如何推进指数?

时间:2016-08-16 21:14:48

标签: ios swift

我试图从iOS 10 beta 6中的索引1开始获取一个字符串的子字符串,这很令人头疼,因为字符串不断变化而且很多文档已经过时且无用。

String有子串(来自:Index),但它不能接受整数(已经有一段时间了),所以我打算使用startIndex并将它推进1,但现在Index没有advanceBy方法,所以我不能这样做:

let aString = "hello"
let subString = aString.substring(from: aString.startIndex.advanceBy(1))

如何从索引1获取子字符串?这些天你如何推进索引,以及子串(来自索引)方法的重点是什么 - 你应该如何使用它?

2 个答案:

答案 0 :(得分:23)

看起来很清楚Swift 3 migration guide中的第一项:

  

最明显的变化是索引不再具有successor()predecessor()advancedBy(_:)advancedBy(_:limit:)distanceTo(_:)方法。相反,这些操作被移动到集合,该集合现在负责递增和递减其索引。

myIndex.successor()  =>  myCollection.index(after: myIndex)
myIndex.predecessor()  =>  myCollection.index(before: myIndex)
myIndex.advance(by: …) => myCollection.index(myIndex, offsetBy: …)

所以看起来你想要像:

let greeting = "hello"
let secondCharIndex = greeting.index(after: greeting.startIndex)
let enryTheEighthGreeting = greeting.substring(from: secondCharIndex) // -> "ello"

(另请注意,如果您希望在Collection上使用String类似功能的索引管理,则有时可以使用其characters视图。String方法,例如{ {1}}和startIndex只是前往index(after:)视图的便利。但这部分并不新鲜,但...... characters已停止String自己在Swift 2 IIRC中。)

SE-0065 - A New Model for Collections and Indices中有更多关于集合索引更改的内容。

答案 1 :(得分:8)

Swift 3:

let str = "hello"
let subStr = str.substring(from:str.index(str.startIndex,offsetBy: 1))
print(subStr)//ello

不太详细的解决方案:

let index:Int = 1
let str = "hello"
print(str.substring(from:str.idx(index)))//ello
extension String{
    func idx(_ index:Int) -> String.Index{
        return self.index(self.startIndex, offsetBy: index)
    }
}