Swift 基本表达

Swift basic 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
 } 

但我总是遇到语法错误,上面会产生 "Expected Separator" 并且不明白为什么。做了更多测试:

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


       Expected Separator before "!"

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


       Braced block of statements is an unused closure

我做错了什么?

初学者:

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

  • 不需要在 let 或 var 声明的 = 左侧指定类型 ifSwift可以从=的右边算出来。很多时候Swift都能算出来,你可以说Swift也能算出来,这样你就可以避免那些多余的杂乱。

  • 如果Swift无法从 右侧。示例:

例如,考虑以下几行:

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

Swift 可以看出是字符串。

对于此功能或 class 类似 returns 一个 UIView:

var myView = ViewReturningClassOrFunc()

考虑一下:

@IBOutlet var myView : UIView!

在上面的行中,Swift无法提前计算出它会被分配一个UIView,所以你必须提供类型。通过在末尾提供 !,您已将其设为 隐式解包 可选。这意味着,就像 ?,你表示它可以是 nil,但你确信它在你访问它时永远不会是 nil,所以 Swift 不会要求您在引用它时在其后加上 !。这个技巧既省时又方便。

你不应该添加 ?到行:

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

正如另一个答案所指出的,您错过了 let。

if let longUrl.rangeOfString(URL_LEXEMA) {
     println("What do I win? :-)")
}

如果您来自其他 Java,您可能会想到像 pointers/references 这样的可选值,因此习惯于将它们等同于 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 中编译。

有可能有时候你在想是否有返回值,但实际上你并不需要那个值,只是想知道它不是 nil。在这种情况下,您可以在不使用 let:

的情况下将值与 nil 进行比较
if longUrl.rangeOfString(LEXEMA) != nil {
    // there was a value, but you don't care what that value was
}

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

if longUrl.hasPrefix(LEXEMA) { }

只需在 !=nil 之间添加一个 space,例如:

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

我在 playground 中测试了你的代码,报告了 Expected ',' separator 错误。

并且不要忘记 1s 和 0sAirspeed Velocity 所说的规则。

swift 是区分大小写的语言。你还需要检查一下 whitespaces

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

语句之间应该有space != nil