Swift do catch中的Var init

Swift do catch中的Var init,swift,swift2,Swift,Swift2,以下代码: // Setup components do { let captureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo) let deviceInput = try AVCaptureDeviceInput(device: captureDevice) let output = AVCaptureMetadataOutput() let sess

以下代码:

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

在此之后,您无法访问初始化的变量。如果我想访问例如
设备输入
,则错误为“使用未解析标识符”。但是为什么呢?
AVCaptureDeviceInput()
崩溃,catch块返回,或者全部正确,变量成功初始化。解决这个问题的最佳解决方案是什么?

块定义了一个新的范围。如果您在
do{}
中使用
let
var
声明变量,那么它们只能在该块中访问。如果要在
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
}

do
块定义了一个新范围。如果您在
do{}
中使用
let
var
声明变量,那么它们只能在该块中访问。如果要在
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
}

瓦卡瓦马的答案是完全正确的,但仅出于教育目的,这里有一个简化版本。除了在
do
块中初始化
deviceInput
之外,您不需要任何操作:

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
失败,“got to here”将不会打印;我们已经有序地退出了该功能

还有一种方法可能是让您周围的函数抛出并执行它,而根本不使用
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()

的调用者身上,Vacawama的答案完全正确,但仅出于教育目的,这里有一个简化版本。除了在
do
块中初始化
deviceInput
之外,您不需要任何操作:

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
失败,“got to here”将不会打印;我们已经有序地退出了该功能

还有一种方法可能是让您周围的函数抛出并执行它,而根本不使用
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()

好东西的调用者身上,特别是第二个例子。我们似乎有了一个有趣的新玩具可以玩。:)好东西,尤其是第二个例子。我们似乎有一个有趣的新玩具玩。:)