swift中的Index

相信很多从OC转写swift的小伙伴都遇到过这样的问题;

Paste_Image.png

点进去看后会发现,此处的参数类型应为String.CharacterView.Index,但是点进去却发现没有构造方法,想当然地尝试下

Paste_Image.png

那怎么办?

swift中的Index_第1张图片
Paste_Image.png

再看一眼,String中关于Index的定义,我们可以发现其中有successor()predecessor()两个方法,分别可以得到当前index的后一个位置和前一个位置,而String中有startIndexendIndex两个属性,我们可以使用这两个属性配合两个获取位置的方法获取到任意的位置,但是这样效率也太慢了,万一需要获取中间的怎么办。别急,还有一个advancedBy(n: Int)方法,可以传入步长,获取到任意的Index。

如果觉得这样太麻烦可以对String进行拓展以符合以前的操作习惯:

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)
    }
}
swift中的Index_第2张图片
Paste_Image.png

当然这只是为了一般字符串的截取的简单操作,如果设计到编码转换的时候不要这么做。

关于swift中为什么使用了Index类型而不是以前的NSUInteger,推荐大家阅读这篇文章:
http://swift.gg/2016/01/25/friday-qa-2015-11-06-why-is-swifts-string-api-so-hard/

你可能感兴趣的:(swift中的Index)