1

以下代码:

// Setup components
do {
    let captureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
    let deviceInput   = try AVCaptureDeviceInput(device: captureDevice)
    let output        = AVCaptureMetadataOutput()
    let session       = AVCaptureSession()
} catch {
    return false
}

在此之后,您将无法访问已初始化的变量。如果我想访问例如,错误是“使用未解析的标识符” deviceInput。但为什么?要么AVCaptureDeviceInput()崩溃,catch-Block 返回,要么一切正常,变量初始化成功。解决这个问题的最佳解决方案是什么?

4

2 回答 2

5

do块定义了一个新的范围。如果您使用letvar在 内声明变量do {},则它们只能在该块内访问。如果要在 之后使用它们,请do {}在语句之前声明它们do。请注意,您不必给它们初始值,即使它们被声明为,let因为在使用它们之前您只会设置它们一次:

func foo() -> Bool {
    // Setup components
    let deviceInput: AVCaptureDeviceInput
    let captureDevice: AVCaptureDevice
    let output: AVCaptureMetadataOutput
    let session: AVCaptureSession

    do {
        captureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
        deviceInput   = try AVCaptureDeviceInput(device: captureDevice)
        output        = AVCaptureMetadataOutput()
        session       = AVCaptureSession()
    } catch {
        return false
    }

    // Do something to demo that the variables are accessible
    print(deviceInput.description)
    print(output.description)
    print(session.description)

    return false
}
于 2015-06-12T01:56:19.427 回答
5

Vacawama 的回答完全正确,但仅出于教育目的,这里有一个简化版本。deviceInput除了在块内进行初始化之外,您不需要任何其他操作do

func test() {
    let captureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
    let deviceInput : AVCaptureDeviceInput
    do { deviceInput = try AVCaptureDeviceInput(device: captureDevice) } catch {return}
    let output = AVCaptureMetadataOutput()
    let session  = AVCaptureSession()
    // ... other stuff here
    print("got to here")
}

如果try失败,“到这里”永远不会打印;我们已经以良好的顺序退出了该功能。

还有一种方法可能是让你周围的函数抛出并直接使用它,根本没有do...catch

func test() throws {
    let captureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
    let deviceInput = try AVCaptureDeviceInput(device: captureDevice)
    let output = AVCaptureMetadataOutput()
    let session = AVCaptureSession()
    // ... other stuff here
    print("got to here")
}

这将错误检查的责任转移到test().

于 2015-06-12T02:59:38.287 回答