12485


Xcode 6.4を使用しています。

iPhoneのバックカメラの映像をAVCaptureVideoPreviewLayerクラスのframeに表示するプログラムを書いていますが、

[code]

    var deviceInput: AVCaptureInput = AVCaptureDeviceInput.deviceInputWithDevice(captureDevice, error: error) as AVCaptureInput
    
[/code]

上記の太字の行で

> ViewController.swift:53:115: 'AnyObject!' is not convertible to  
>  'AVCaptureInput'; did you mean to use 'as!' to force downcast?

というエラーが発生します。

そしてasをas!にしましたが今度は同じ行で  
fatal error: unexpectedly found nil while unwrapping an Optional value  
というエラーが発生します。

一応、その前のプログラムも添付しておきます。（サンプルプログラムのままです）

[code]

    func configureCamera() -> Bool {
        // init camera device
        var captureDevice: AVCaptureDevice?
        var devices: NSArray = AVCaptureDevice.devices()
    
        // find back camera
        for device: AnyObject in devices {
            if device.position == AVCaptureDevicePosition.Back {
                captureDevice = device as? AVCaptureDevice
            }
        }
    
        if (captureDevice != nil) {
            // Debug
            println(captureDevice!.localizedName)
            println(captureDevice!.modelID)
        } else {
            println("Missing Camera")
            return false
        }
    
        // init device input
        var error: NSErrorPointer!
        var deviceInput: AVCaptureInput = AVCaptureDeviceInput.deviceInputWithDevice(captureDevice, error: error) as! AVCaptureInput
    
        self.stillImageOutput = AVCaptureStillImageOutput()
    }
    
[/code]


CC BY-SA 3.0
2015-07-19T11:34:43.343
12483
2015-07-19T14:11:07.510
2015-07-19T11:44:46.573
7362
8593
question
swift xcode
(swift) wnwrappingできないオプションバリュー


unwrap に失敗するであろう箇所が二つあります：

[code]

    // init device input
    var error: NSErrorPointer!
    var deviceInput: AVCaptureInput = AVCaptureDeviceInput.deviceInputWithDevice(captureDevice, error: error) as! AVCaptureInput
    
[/code]

まず、`error` 変数を初期化せずに `deviceInputWithDevice` に渡しています。

エラー情報を受け取る場合は、ドキュメントで紹介されている方法を使われることをお勧めします。以下が基本的なパターンです：

[code]

    var error: NSError?
    let result = foo(param, &error)
    
[/code]

[Using Swift with Cocoa and Objective-C: Adopting Cocoa Design
Patterns](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/AdoptingCocoaDesignPatterns.html#//apple_ref/doc/uid/TP40014216-CH7-XID_7)

* * *

もう一つは、`deviceInputWithDevice` の返り値の型が `AnyObject!`となっているのですが、ヘッダのコメントによると、nil
を返すこともあるようです。

よって `as! AVCaptureInput` のような強制 unwrap は失敗する可能性があります。

[code]

    var deviceInput: AVCaptureInput? = AVCaptureDeviceInput.deviceInputWithDevice(captureDevice, error: error) as? AVCaptureInput
    
[/code]

としてください。


CC BY-SA 3.0
2015-07-19T14:11:07.510
12485
2015-07-19T14:11:07.510
2299
12483
answer