2014-10-26 58 views
2

苹果Swift language documentation可选结合(又名if let)将“检查值一个可选的”和“提取物该值装入”一个变量或常量)。但这与我所看到的不符。例如为什么Swift的可选绑定在某些情况下以'nil'成功?

var x: Int? = nil 

if let y1: Int? = x { 
    println("y1 = \(y1)") // This is printed, suggesting that x is not checked "inside", but left as Optional(nil) (!= nil) 
} 

if let y2: Int? = x? { 
    println("y2 = \(y2)") 
} 

if let y3: Int = x? { 
    println("y3 = \(y3)") 
} 

if let y4: Int = x { 
    println("y4 = \(y4)") 
} 

if let y5 = x? { 
    println("y5 = \(y5)") 
} 

if let y6 = x { 
    println("y6 = \(y6)") 
} 

结果(只)

"y1 = nil" 

表明的x没有检查“内部”是发生在y1情况下(以及x留作包裹nil,这是不等于打开nil)。 y2的情况似乎通过强制“检查内部”(或只是可选链接“接管”)来证实这一点;但由于y4y6案件也不打印,因此在故事中必须有更多内容,因此表现得好像正在发生“内部检查”一样。

我怀疑是有一些有识之士从试图

"x = 42" 

导致

"y1 = Optional(42)" 
"y2 = Optional(42)" 
"y3 = 42" 
"y4 = 42" 
"y5 = 42" 
"y6 = 42" 

来获得,但如果三个的一些在那里,它失去了我。 (1)如果需要明确的检查(使用?),表达式右边的“可选”确实会得到“检查内部”(?);但除此之外(2)表达式的左侧影响执行检查的“内部”的程度(仅足够进行有效的分配)。

在每种情况下,可选绑定是如何工作的?特别是当x == nil为什么y1打印,并给出它的确如此,为什么不y4y6(或生成分配错误)?

回答

2

我解释这是不同的:

var x: Int? = 1 

if let y1: Int = x { 
    println("y1 = \(y1)") 
} 

//prints y = 1, the optional was checked, contains a value and passes it 

var x: Int? = nil 

if let y1: Int = x { 
    println("y1 = \(y1)") 
} 

//does not execute because x does not contain value that can be passed to a non optional y 

var x: Int? = nil 

if let y1: Int? = x { 
    println("y1 = \(y1)") 
} 
// y = nil, since y is optional and can hold a value of x which is nil, then it passes nil 

可选的结合是检查是否可选包含的值传递给非可选参数。

+0

所以它是这样的:右侧首先检查“可选链”(这是第一个'y2','y3'和'y5'结束的地方)。那么,如果这不是“无”,那么如果可以进行有效的分配,那么事情就会进行。这很简单吗? – orome 2014-10-26 18:40:41

+0

是的,如果沿链的任何地方,它是零,绑定将失败。如果你需要知道绑定失败的地方,这里有一个很好的讨论:http://stackoverflow.com/questions/26524246/how-to-know-where-optional-chaining-is-breaking – 2014-10-26 18:44:33

+0

所以:在案例' y2','y3'和'y5'可选*链接*命中'nil'并且事情结束。在'y4'和'y6'的情况下,检查'x'里面的内容,找到'nil'(并且不能指定给非可选项),这样事情就结束了。但是我仍然对'y1'发生了什么事情感到困惑:似乎没有“check inside”在这里发生。如果有的话,事情就会失败(例如'如果让y1:Int?= nil {...}'失败)。这似乎是“检查里面”发生*必要的,以获得工作分配*。 – orome 2014-10-26 18:59:31

1

您为可选的Int分配了一个可选的Int。任务确实成功了。无论可选的Int是否包含Int,它都会成功。

+0

所以在这种情况下('y1')没有发生“内部检查”。这种检查似乎只有在需要使分配工作时才会真正发生(情况'y4'和'y6',正如'x'不是''nil'时所显示的那样)。对? – orome 2014-10-26 19:05:10

+0

这里的症结(对我来说)是为什么让y1:Int? = nil {...}'的行为与'let y1:Int不同? = x {...}'其中'x'是'nil'。 (请参阅[其他答案](http://stackoverflow.com/a/26576451/656912)上的讨论)。 – orome 2014-10-26 20:54:06

相关问题