【问题标题】:How to use substringToIndex in Swift? [duplicate]如何在 Swift 中使用 substringToIndex? [复制]
【发布时间】:2014-09-14 07:09:32
【问题描述】:

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

UIDevice.currentDevice().identifierForVendor.UUIDString.substringToIndex(8)

类型“String.Index”不符合协议“IntegerLiteralConvertible”

我的意图是获取子字符串,但是如何?

【问题讨论】:

  • 更优雅的解决方案 ( UIDevice.currentDevice().identifierForVendor.UUIDString as NSString).substringToIndex(8) - 需要转换类型

标签: swift substring


【解决方案1】:

在 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"

【讨论】:

  • 在 Swift 2 中,Advance 不再是全局函数,而是 Index 上的函数。 s.startIndex.advanceBy(5)
  • 不适用于 Swift 2.1。我得到了消息:“'index'类型的值......没有成员'advancedBy'”。
  • @FrederickC.Lee 新语法是s.startIndex.advancedBy(1)
  • 使用 NSString 并不是真正的 Swift 答案。
  • @benleggiero - 你读过答案了吗?给出了两种方法,一种使用 Swift,一种使用 NSString...
猜你喜欢
  • 2016-07-13
  • 1970-01-01
  • 1970-01-01
  • 2019-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-25
相关资源
最近更新 更多