Swift基本表达

时间:2015-04-04 23:03:16

标签: swift expression

我对swift非常陌生,但精通Java,JavaScript,C等其他语言......在创建表达式时,我迷失了Swift语法。看看这个基本示例,我只是通过调用返回String.rangeOfStringOptional Range

Range?来确定一个字符串是否包含在另一个字符串中

这可以按预期工作:

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

let range=longUrl.rangeOfString(LEXEMA);
if (range? != nil) {
   // blah
} 

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

 if (longUrl.rangeOfString(LEXEMA)? !=nil) {
      // blah
 } 

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

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


       Expected Separator before "!"

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


       Braced block of statements is an unused closure

我做错了什么?

4 个答案:

答案 0 :(得分:5)

如果您来自其他类似Java,您可能会考虑像指针/引用这样的选项,因此习惯于将它们等同于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
}

请注意,您使用的?后缀行为会在Swift 1.2中发生变化,因此即使您在1.1中编译的问题中的代码也不会在1.2中。

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

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

尽管如此,上述内容可能更好地表达为:

if longUrl.hasPrefix(LEXEMA) { }

答案 1 :(得分:2)

首先:

  • 需要使用if语句括号,除非您有嵌套的括号括号表达式。

  • 可以从=的右侧看出来。很多时候,Sw​​ift可以解决它,你可以告诉Swift可以解决它,所以你可以避免那种多余的混乱。

  • 需要指定类型,如果Swift无法从中找出类型 右边。例如:

例如,请考虑以下几行:

=
斯威夫特可以发现他们是弦乐。

此函数或类返回UIView:

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

考虑一下:

var myView = ViewReturningClassOrFunc()

在上面一行中,Swift无法提前确定它将被分配@IBOutlet var myView : UIView! ,因此您必须提供类型。通过在结尾处提供UIView,您已将其设为隐式展开的可选项。这意味着,就像!一样,您指出它可以是?,但您确信它在您访问它时永远不会nil,因此Swift赢了& #39; t要求您在引用它之后放置nil。这个技巧可以节省时间和方便。

你不应该添加?到线:

!

另一个答案指出,你错过了这个。

if (longUrl.rangeOfString(URL_LEXEMA) !=nil) {

答案 2 :(得分:0)

swift是区分大小写的语言。您还需要检查空白

if longUrl.rangeOfString(LEXEMA) != nil { 
//your condition
}

声明之间应该有空格!= nil

答案 3 :(得分:-1)

只需在!=nil之间添加一个空格,如:

if longUrl.rangeOfString(LEXEMA) != nil {
  // blah
}

我在游乐场测试了您的代码,报告了预期','分隔符错误。

不要忘记 1s和0s 以及 Airspeed Velocity 所说的规则。