在 Swift 中,String 索引尊重字素簇,IndexType 不是Int。您有两个选择 - 将字符串(您的 UUID)转换为 NSString,并将其用作“之前”,或者创建第 n 个字符的索引。
两者如下图所示:
但是,该方法在 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-单击String 您会发现以下内容:
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>
}
斯威夫特 2
正如评论员@DanielGalasko 指出的advance 现在已经改变了......
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"
斯威夫特 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"
斯威夫特 4
在 Swift 4 中,还有一个变化:
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 ss3: Substring = s[..<index] // "Stack"
var ss4: String = String(s[..<index]) // "Stack"