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ですか?

Apple のドキュメントによると、これは同等のものです。

a != nil ? a! : b

a が nil の場合、b が返されますが、b がオプションの型であるかどうかは問題ですか?

編集

誰かが疑問に思っている場合に備えて、関数を呼び出すと次のようになります。

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

2 に答える 2

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}

理由について知りたいことはおそらくこの記事を参照してください。ただし、簡単に言えば、実行時のaとの値に関係なく、コンパイル時に特定の型として結果を修正する必要がありbます。bはオプションであるためa!、2 つの型に互換性を持たせるために暗黙的にオプションにラップされます。このように言えば、結果がオプションではなく、 だった場合、結果はbどうnilなるでしょうか?

??結果をオプションでなくするオプションではない 3 番目の値を最後に置くことができるように連鎖できることに注意してください。

于 2015-01-04T16:09:19.697 に答える
0

これは合体なしです。

b がオプションでない場合 : a が
a ?? bnil でない場合、ラップされていない a を返します。a が nil の場合、b を返します。

b がオプションでない場合 : a が
a ?? bnil でない場合、a を返します。a が nil の場合、b を返します。

このコードは機能します。ただし、とにかくエラーを個別にキャプチャしているため、error.localDescription(失敗した場合) に割り当てるのではなく、responseDictionary を nil のままにしておくことをお勧めします。それはちょうど良いデザインです。以下のように。

let responseDictionary: AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options: .allZeros, error:&error)
于 2015-01-04T16:21:51.957 に答える