在Swift中,这个特定的语法是什么意思?

时间:2015-11-23 03:18:14

标签: swift parse-platform

我一直在尝试关注一些iOS Swift教程以连接到Parse.com

codementor.io tutorial

  loginViewController.fields = .UsernameAndPassword | .LogInButton | .PasswordForgotten | .SignUpButton | .Facebook | .Twitter

makeschool tutorial

  loginViewController.fields = [.UsernameAndPassword, .LogInButton, .SignUpButton, .PasswordForgotten, .Facebook]

我假设前者是Switch 1.x,而thelatter是Swift 2.从上下文看,他们似乎做了同样的事情,但我还没有找到语法变化的语言参考。非常难以搜索点,管道和逗号......有人可以解释每个片段中的语法吗? (我正在阅读语言规范,但实际上让应用程序工作会很有趣!)

2 个答案:

答案 0 :(得分:7)

旧的Swift 1语法基于您处理C和Objective-C中的选项集的方式:您将选项集存储为整数类型并使用按位运算符(|&~)来操纵它们。因此,.UsernameAndPassword | .LogInButton表示一个选项集,其中包含.UsernameAndPassword.LogInButton选项。在旧语法中,您使用nil来表示一个空选项集(其中不包含任何选项),根据非空集的语法,这一点并不明显。

Chris Lattner描述了WWDC 2015 Session 106: What's New in Swift中改变的语法。首先,他描述了旧语法的问题:

  

问题是,当你得到你最终使用的其他语法时,它就不那么好了。你用nil创建一个空选项集 - 它没有意义,因为选项集和选项是完全不同的概念,它们被混合在一起。你使用按位运算来提取它们,这是一个痛苦而且容易出错的错误,你很容易弄错。

然后他描述了新的方法:

  

但是Swift 2解决了这个问题。它使选项集像集一样。这意味着选项集和集合现在形成方括号。这意味着你得到一组带有空方括号的空集,并且你可以使用完整的标准集API来处理选项集。

新语法起作用的原因是因为OptionSetType符合ArrayLiteralConvertible协议(间接地,符合SetAlgebraType)。该协议允许使用数组文字初始化符合对象,方法是使用init来获取元素列表。

在新的Swift 2语法中,[ .UsernameAndPassword, .LogInButton ]表示包含.UsernameAndPassword.LogInButton选项的选项集。请注意,它看起来就像您可以初始化普通旧Setlet intSet: Set<Int> = [ 17, 45 ]的语法。新语法很明显,您指定一个空选项设置为[]

答案 1 :(得分:1)

Swift不再支持使用第一行的竖线操作符。第二种是采用枚举的不同情况,并将它们描述为一个选项集。这是一个例子from the Swift docs

enum CompassPoint {
    case North
    case South
    case East
    case West
}

directionToHead = .South

switch directionToHead {
case .North:
    print("Lots of planets have a north")
case .South:
    print("Watch out for penguins")
case .East:
    print("Where the sun rises")
case .West:
    print("Where the skies are blue")
}

// prints "Watch out for penguins"