2015-06-12 1 views
1

следующий код:Var INIT в сделай уловом

// 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 возвращается, либо все правильно, и переменные успешно инициализируются. Какое лучшее решение для решения этой проблемы?

ответ

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().

+0

Хороший материал, особенно второй пример. – vacawama

+1

У нас, похоже, есть интересная новая игрушка для игры. :) – matt

5

Блок do определяет новый масштаб. Если вы объявляете переменные с let или var внутри 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 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^