2014-10-29 62 views
7

我不確定它是否是XCode中的錯誤,或者我不瞭解Swift中的範圍。這裏是一些代碼來顯示範圍如何工作:如何比較Swift中的範圍?

let range = 0..<5 
contains(range, 0) // true 
contains(range, 5) // false 
range.startIndex == 0 // true 
range.endIndex == 5 // true 

let str = "Hello, playground" 
str.rangeOfString("Hello")! // 0..<5 

太棒了!現在讓我們使用它真正的代碼:

let str = "Hello, playground" 
if let range = str.rangeOfString("Hello") { 
    if range.startIndex == 0 { 
     print("str starts with 'Hello'") 
    } 
} 

我得到的線,上面寫着if range.startIndex == 0 {

不能與類型的參數調用LIS「==」(String.index以下錯誤, IntegerLiteralConvertible )」

回答

8

rangeOfString實際上返回的範圍String.Index s且不Int S;兩者不具可比性(儘管操場顯示範圍爲0..<5)。您可以在this question的答案中閱讀有關原因。如果你需要比較的範圍內的startIndex有,比方說,第二個字符

let str = "Hello, playground" 
if let range = str.rangeOfString("Hello") { 
    if range.startIndex == str.startIndex { 
     print("str starts with 'Hello'") 
    } 
} 

如果你希望你的例子,那麼工作,而不是與0比較range.startIndex,你應該把它與str.startIndex比較在字符串中的索引,那麼你可以通過1使用advance功能來增加str.startIndex和比較range.startIndex到:

let str = "Hello, playground" 
if let range = str.rangeOfString("e") { 
    if range.startIndex == advance(str.startIndex, 1) { 
     print("str's 2nd character is 'e'") 
    } 
} 

如果你需要知道的範圍內的長度,那麼你可以使用distance功能:

let str = "Hello, playground" 
if let range = str.rangeOfString("play") { 
    let length = distance(range.startIndex, range.endIndex) 
    print("found a range \(length) characters long") 
} 
+0

不錯的答案。我認爲所有這個儀式都是爲了更好的Unicode支持。例如它支持像「ﷺ」這樣的瘋狂字符。我只是試過 – Mohsen 2014-10-29 23:57:32

+0

確切的說,它就是這樣的Unicode支持。基本上它可以讓你一次跳一個字符,即使字符是多字節。 – 2014-10-30 00:05:36

+1

@Mohsen這不是一個瘋狂的角色,而是一個阿拉伯語的句子,他說:「和平在他身上」(صلىاللهعليهوآلهوسلم)穆斯林用來表揚先知。作爲一種便利(因爲它經常被使用),這個句子作爲一個包裝的連字字形存在(和其他許多字形一樣)。希望它揭開一個謎:-) – 2015-09-09 11:53:06

5

在斯威夫特的〜=操作

有時候,我們要檢查,如果數字是一個範圍之間,和往常一樣,我們做這樣的事情:

檢查數量爲0至100包括

if number >=0 && number <= 100 { 
    // TODO: 
} 

它的工作原理,但我們可以做的更好, swiftier。 Swift標準庫有一個〜=操作符,所以我們可以替代:

if 0...100 ~= number { 
    // TODO: 
}