我一直在尝试关注一些iOS Swift教程以连接到Parse.com
loginViewController.fields = .UsernameAndPassword | .LogInButton | .PasswordForgotten | .SignUpButton | .Facebook | .Twitter
loginViewController.fields = [.UsernameAndPassword, .LogInButton, .SignUpButton, .PasswordForgotten, .Facebook]
我假设前者是Switch 1.x,而thelatter是Swift 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
选项的选项集。请注意,它看起来就像您可以初始化普通旧Set
:let 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"