我试图掌握Swift,以及如何最好地从选项中分离nil和有效对象。
我有这段代码:
var my AwesomeDict = [:]()
...
... (myAwesomeDict gets populated)
...
let myOptionalObject:objectClass? = myAwesomeDict[key]
if let myUnwrappedObject = myOptionalObject {
...
} else {
println("Sorry, object is nil")
}
当我在if子句周围放置括号(我觉得它提高了可读性)时,XCode会用编译器错误标记该行:
模式变量绑定不能出现在表达式
中
有什么不同
if (let myUnwrappedObject = myOptionalObject) {
这
if let myUnwrappedObject = myOptionalObject {
?可悲的是,文档没有提到条件的支撑效果。我似乎需要使用无支架版本,但希望对原因更加开明。
答案 0 :(得分:4)
在这里,if let
本身就是一种模式。因此,如果在if和let之间放置一个括号,则会破坏模式。
如果你这样做,Swift认为你想检查let
本身。
所以简单地说:如果你使用if let
,请不要使用括号,因为它会破坏if let
模式。
答案 1 :(得分:3)
根据the document:
if
语句的语法是
if [condition] {
[statements]
}
此处的[condition]
定义为:
if-condition
→expression
|value-binding-pattern
此处let ...
是"Value-Binding Pattern"。
value-binding-pattern
→varpattern
| letpattern
至于( ... )
,它不是value-binding-pattern
,因为它不是以let
也不是var
开头,因此它必须是表达式。在表达式的规范中,我们唯一能够找到以(
开头且以)
结尾的内容称为"Parenthesized Expression"。
parenthesized-expression
→(expression-element-list
opt )
expression-element-list
基本上是逗号分隔的表达式列表。并且表达式不包括value-binding-pattern
。这就是为什么你不能在let ...
附近放置括号。