如何在Swift中使用substringToIndex?

Ján*_*nos 67 substring swift

我在这一行遇到编译器错误:

UIDevice.currentDevice().identifierForVendor.UUIDString.substringToIndex(8)
Run Code Online (Sandbox Code Playgroud)

类型'String.Index'不符合协议'IntegerLiteralConvertible'

我的意图是得到子串,但是如何?

Gri*_*mxn 182

在Swift中,String索引关注字形集群,而a 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"
Run Code Online (Sandbox Code Playgroud)

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>
}
Run Code Online (Sandbox Code Playgroud)

斯威夫特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"
Run Code Online (Sandbox Code Playgroud)

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"
Run Code Online (Sandbox Code Playgroud)

Swift 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"
Run Code Online (Sandbox Code Playgroud)

  • 使用`NSString`并不是一个真正的Swift答案. (7认同)
  • 在Swift 2中,advance不再是一个全局函数,而是一个函数`Index`.`s.startIndex.advanceBy(5)` (4认同)
  • @ FrederickC.Lee的新语法是`s.startIndex.advancedBy(1)` (2认同)

归档时间:

查看次数:

56005 次

最近记录:

7 年,5 月 前