Swift基本表达

rup*_*pps 2 expression swift

我非常喜欢快速,但精通Java,JavaScript,C等其他语言......在创建表达式时,我迷失了Swift语法.看看这个基本的例子,我只是通过调用String.rangeOfString返回一个Optional Range(Range?)来确定一个字符串是否包含在另一个字符串中

这按预期工作:

let LEXEMA:String="http://"
let longUrl:String="http://badgirls.many/picture.png"

let range=longUrl.rangeOfString(LEXEMA);
if (range? != nil) {
   // blah
} 
Run Code Online (Sandbox Code Playgroud)

现在我正在尝试将if中的表达式组合起来,例如:

 if (longUrl.rangeOfString(LEXEMA)? !=nil) {
      // blah
 } 
Run Code Online (Sandbox Code Playgroud)

但我总是得到语法错误,上面会产生一个"预期的分隔符"并且无法理解为什么.做了一些测试:

  if (absolutePath.rangeOfString(URL_LEXEMA) !=nil) { }


       Expected Separator before "!"

  if absolutePath.rangeOfString(URL_LEXEMA) !=nil { }


       Braced block of statements is an unused closure
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Air*_*ity 5

如果你来自像Java这样的其他人,你可能会考虑像指针/引用这样的选项,所以习惯于将它们等同于nil非nil,使用它们.但这可能会导致更多混乱.相反,将它们视为可能结果的容器,需要打开才能使用. if let结合了测试和解包操作.

考虑到这一点,以下是您可以调整代码的方法:

let LEXEMA: String="http://"
let longUrl: String="http://badgirls.many/picture.png"

if let range = longUrl.rangeOfString(LEXEMA) {
    // use range, which will be the unwrapped non-optional range
}
else {
    // no such range, perhaps log an error if this shouldn’t happen
}
Run Code Online (Sandbox Code Playgroud)

请注意,?您使用的后缀行为在Swift 1.2中有所改变,因此即使您在1.1中编译的问题中的代码也不会在1.2中.

有时你可能会返回一个值,但实际上并不需要这个值,只是知道它不是零.在这种情况下,您可以将值与nil进行比较,而不是let:

if longUrl.rangeOfString(LEXEMA) != nil {
    // there was a value, but you don't care what that value was
}
Run Code Online (Sandbox Code Playgroud)

也就是说,以上内容可能更好地表达为:

if longUrl.hasPrefix(LEXEMA) { }
Run Code Online (Sandbox Code Playgroud)