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