ダーヤス.com プレミアム

ダーヤス.comにようこそ。プレミアムな情報で、ワークライフバランスの充実を図りませんか。

【Swift】【Xcode】加速度センサ(data:CMAccelerometerData?, error:NSError?) -> Void inでエラー解決

   

CMAccelerometerData!,NSError!,void

Swiftで加速度センサを使う場合のハンドラの定義について、本とかネットとかで出てる情報を参照すると、

let accelerometerHandler:CMAccelerometerHandler = {
(data:CMAccelerometerData!, error:NSError!) -> Void in
}

といった感じで書いてあります。
でもこれをXcodeで書いて実行しようとするとこういうエラーが出るんですよねえ。。。

Cannot convert value of type '(CMAccelerometerData!, NSError!) -> Void' to specified type 'CMAccelerometerHandler' (aka '(Optional, Optional) -> ()')

つまり(CMAccelerometerData!, NSError!) の値はVoidにコンバートできないっちゅうことなんですけど、何度確認しても別に自分のタイプミスがあったわけではないし、いろんなサイト覗いてもこれを解決する情報が出てこない。
これもxcode7にバージョンアップされたことに伴って仕様が変わったのかなあ。。

だいぶハマったのですが、まあオプショナルの「!」だからnull値というかnilというか値のない値は入れられないんじゃないかと思って

let accelerometerHandler:CMAccelerometerHandler = {
(data:CMAccelerometerData?, error:NSError?) -> Void in
}
とoptional valueを「?」で設定してみたらエラーが消えた。

で、実際に加速度値を使うときには「!」で確定してやればいいと。

加速度値を取得してデバッガにログ表示するときはこんな感じ。

//ハンドラの設定
let accelerometerHandler:CMAccelerometerHandler = {
(data:CMAccelerometerData?, error:NSError?) -> Void in

//ログにx,y,zの加速度を表示
print("x:\(data!.acceleration.x) y:\(data!.acceleration.y) z:\(data!.acceleration.z)")

}

//取得開始して、上記で設定したハンドラを呼び出し、ログを表示する
motionManager.startAccelerometerUpdatesToQueue(NSOperationQueue.currentQueue()!,withHandler:accelerometerHandler)

あと、ハンドラ呼び出しの際の「NSOperationQueue.currentQueue()」も、xcode7にバージョンアップされてからはoptional valueの「!」をつけてやらないとエラーになるような気がしているので注意が必要だと思います。

加速度センサってどんなときに使うのか

ところで加速度センサ使うアプリってどんなのが応用できそうですかね。。
今自分はゲームプロジェクトばっかり立ち上げて適当にクソゲー作ったりしてるのですが、ゲームの場合に画面をあちこち動かしているのってあんまり聞かないというか。
まあ昔は中のビー玉を動かして穴に入れるみたいな物理的なゲームがあったのでそういうのをアプリで実装することは可能ですが、最近のゲームアプリで加速度センサ使ってるのってあるのだろうか。
まああんまりアプリダウンロードしてないので全然わからないですが。

 - アプリ開発, テクノロジー