相信很多從OC轉(zhuǎn)寫(xiě)swift的小伙伴都遇到過(guò)這樣的問(wèn)題;

Paste_Image.png
點(diǎn)進(jìn)去看后會(huì)發(fā)現(xiàn),此處的參數(shù)類型應(yīng)為String.CharacterView.Index,但是點(diǎn)進(jìn)去卻發(fā)現(xiàn)沒(méi)有構(gòu)造方法,想當(dāng)然地嘗試下

Paste_Image.png
那怎么辦?

Paste_Image.png
再看一眼,String中關(guān)于Index的定義,我們可以發(fā)現(xiàn)其中有successor()和predecessor()兩個(gè)方法,分別可以得到當(dāng)前index的后一個(gè)位置和前一個(gè)位置,而String中有startIndex和endIndex兩個(gè)屬性,我們可以使用這兩個(gè)屬性配合兩個(gè)獲取位置的方法獲取到任意的位置,但是這樣效率也太慢了,萬(wàn)一需要獲取中間的怎么辦。別急,還有一個(gè)advancedBy(n: Int)方法,可以傳入步長(zhǎng),獲取到任意的Index。
如果覺(jué)得這樣太麻煩可以對(duì)String進(jìn)行拓展以符合以前的操作習(xí)慣:
extension String{
func substringToIndex(index: UInt) -> String {
return self.substringToIndex(self.startIndex.advancedBy(Int(index)))
}
func substringFromIndex(index: UInt) -> String {
return self.substringFromIndex(self.startIndex.advancedBy(Int(index)))
}
func substringWithRange(start: UInt, end: UInt) -> String {
let range = self.startIndex.advancedBy(Int(start)) ..< self.startIndex.advancedBy(Int(end))
return self.substringWithRange(range)
}
}

Paste_Image.png
當(dāng)然這只是為了一般字符串的截取的簡(jiǎn)單操作,如果設(shè)計(jì)到編碼轉(zhuǎn)換的時(shí)候不要這么做。
關(guān)于swift中為什么使用了Index類型而不是以前的NSUInteger,推薦大家閱讀這篇文章:
http://swift.gg/2016/01/25/friday-qa-2015-11-06-why-is-swifts-string-api-so-hard/