CaptureStillImageAsynchronouslyFromConnection的函数声明和参数描述之间的冲突?

时间:2016-03-21 07:00:51

标签: ios swift avfoundation

根据类引用,captureStillImageAsynchronouslyFromConnection的完成处理程序接受NSError对象,但它不是可选的。

功能声明:

func captureStillImageAsynchronouslyFromConnection(connection: AVCaptureConnection!, completionHandler handler: ((CMSampleBuffer!, NSError!) -> Void)!)

然而,在参数的描述中,如果请求得到满足,则表示可以在完成处理程序中返回nil来代替NSError对象。

参数说明:

If the request could not be completed, an NSError object that describes the problem; otherwise nil.

说明建议声明应该包含NSError对象的可选项,不是吗?参数描述和函数声明是否冲突?

1 个答案:

答案 0 :(得分:1)

只要你不打开并使用null的可选项,你就可以了。

以下是显示变体的示例代码。请注意,回调签名使用隐式展开选项,而传递的参数可以是nil。

import Foundation

struct Buffer {
}

func foo(callback: (buffer: Buffer!, error: NSError!) -> Void) {
    print("#1: buffer and error are nil")
    callback(buffer: nil, error: nil)
    print("#2: buffer not nil, error is nil")
    callback(buffer: Buffer(), error: nil)
    print("#3: buffer is nil, error is not nil")
    callback(buffer: nil, error: NSError(domain: "domain", code: 123, userInfo: nil))
    print("#4: both buffer and error are not nil")
    callback(buffer: Buffer(), error: NSError(domain: "domain", code: 123, userInfo: nil))
}

func cb(buffer: Buffer!, error: NSError!) {
    if let buffer = buffer {
        print(buffer)
    }
    else {
        print("buffer is nil")
    }

    if let error = error {
        print(error)
    }
    else {
        print("error is nil")
    }
}

foo(cb)

从这个例子中可以看出,一个隐式的unwrapped可选项可以是nil。这就是NSError的描述。