2014-07-23 20 views
64

我得到編譯器錯誤在這行:如何在Swift中使用substringToIndex?

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

類型「String.Index」不符合協議「IntegerLiteralConvertible」

我的目的是讓子,但如何?

+0

更優雅的解決方案**(** UIDevice.currentDevice()。identifierForVendor.UUIDString ** as NSString)**。substringToIndex(8) - 需要轉換類型 –

+1

對於基於標題來到這裏的人來說,假定的重複不是很很有幫助。 – Suragch

回答

174

在Swift中,String索引尊重字形集羣,並且IndexType不是Int。您有兩種選擇 - 將字符串(您的UUID)轉換爲NSString,並將其用作「before」,或者爲第n個字符創建索引。

兩者都如下所示:

然而,該方法已經夫特版本之間徹底改變。讀下來以後的版本...

斯威夫特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
作爲commen tator @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
在斯威夫特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
在斯威夫特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" 
+1

你可以,請問,你的回答顯然增加了類型的變數?謝謝! – holex

+1

添加的類型和聲明。 – Grimxn

+4

在Swift 2中,advance不再是一個全局函數,而是一個'Index'函數。 's.startIndex.advanceBy(5)' –