2014-10-29 51 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: 
}