参见英文答案 >
Type ‘String.Index’ does not conform protocol ‘IntegerLiteralConvertible’3答案我在这行得到编译器错误:
UIDevice.currentDevice().identifierForVendor.UUIDString.substringToIndex(8)
类型“String.Index”不符合协议“IntegerLiteralConvertible”
我的目的是获取子字符串,但是如何?
在Swift中,字符串索引涉及字形集群,而IndexType不是Int。您有两个选择 – 将字符串(您的UUID)转换为NSString,并将其用作“before”,或者为第n个字符创建索引。
两者如下图所示:
然而,该方法在Swift版本之间发生了根本性的变化。阅读以下版本…
Swift 1
let s: String = "Stack Overflow" let ss1: String = (s as NSString).substringToIndex(5) // "Stack" //let ss2: String = s.substringToIndex(5)// 5 is not a String.Index let index: String.Index = advance(s.startIndex,5) let ss2:String = s.substringToIndex(index) // "Stack"
CMD点击substringToIndex混淆地带你到NSString定义,但CMD点击字符串,你会发现以下:
extension String : Collection { struct Index : BidirectionalIndex,Reflectable { func successor() -> String.Index func predecessor() -> String.Index func getMirror() -> Mirror } var startIndex: String.Index { get } var endIndex: String.Index { get } subscript (i: String.Index) -> Character { get } func generate() -> IndexingGenerator<String> }
Swift 2
作为评论员@DanielGalasko指出提前已经改变…
let s: String = "Stack Overflow" let ss1: String = (s as NSString).substringToIndex(5) // "Stack" //let ss2: String = s.substringToIndex(5)// 5 is not a String.Index let index: String.Index = s.startIndex.advancedBy(5) // Swift 2 let ss2:String = s.substringToIndex(index) // "Stack"
Swift 3
在Swift 3中,它再次改变:
let s: String = "Stack Overflow" let ss1: String = (s as NSString).substring(to: 5) // "Stack" let index: String.Index = s.index(s.startIndex,offsetBy: 5) var ss2: String = s.substring(to: index) // "Stack"