2015-01-04 84 views
0

默认值我有这样的:无凝聚:使用可选的类型,在斯威夫特

let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) 

     dispatch_async(queue, { 
      if let data = NSURLConnection.sendSynchronousRequest(self.buildRequestForVenueLocation(location, identifier), returningResponse: &response, error: &error) { 
       let responseDictionary: AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options: .allZeros, error:&error) ?? error?.localizedDescription 
       dispatch_async(dispatch_get_main_queue(), { 
        completion(venues: responseDictionary, error: error) 
       }) 
      } else { 
       println("There was a problem with the request...") 
      } 
     }) 

我的问题是关于这一行特别是:

let responseDictionary: AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options: .allZeros, error:&error) ?? error?.localizedDescription 

nil coalescing这个正确使用?

根据苹果的文档,这是equvivalent:

a != nil ? a! : b 

如果是零,则返回B,但它是物质如果B是一个可选的类型?

编辑

为了防止有人知道,这里是什么样子时,我调用该函数,如:

v.performVenueLocationRequest(l.location, identifier: "4d4b7105d754a06374d81259") { 
     if let result = $0 as? [String: AnyObject] ?? $1 { 
      println(result) 
     } 
    } 

回答

1

这取决于你所说的“事情”是什么意思。它会工作。它只是可能不是你想要的东西 - 如果b是可选的,那么结果也将是可选的,即即使a有它仍然不会被解开的值:

let a: Int? = 2 
let b: Int? = 3 
let c = i ?? j 
// c is {Some 2} 

与:

let i: Int? = nil 
let j: Int? = 3 
let k = i ?? j 
// k is {Some 3} 

比你想知道为什么可能更见this article,但在短:结果必须被固定为在编译的时候,无论什么ab值是在运行时的特定类型。由于b是可选的,因此a!隐式包装在可选中以使两种类型兼容。这样说 - 如果结果不是可选的,并且bnil,那么结果是什么?

请记住,你可以链??,所以你可以把对不可选,这将使结果非可选结束的第三值。

+0

明白了,谢谢!在我的情况,但 - 传递给接受两个可选参数反正封字典,然后我在实际的函数调用 –

0

这是零合并。

如果b为不可选:
a ?? b会返回一个解开,如果不是零。如果a是零,它将返回b。

如果b不是可选的:
a ?? b将返回a,如果a不是零。如果a是零,它将返回b。

此代码将工作。 但是,由于无论如何都是单独捕获错误,因此我建议将responseDictionary保留为零而不是将其分配给error.localDescription(如果失败)。这只是更好的设计。如下所示。

let responseDictionary: AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options: .allZeros, error:&error) 
+1

解开“这是无聚结14 B将返回一个解开,如果不是零。如果a是零,它将返回b。“不,如果'b'是可选的,它不会... –

+0

哦谢谢。如果b是可选的,我不知道会发生什么。但是有道理。 – rakeshbs