質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

2368閲覧

Swift モーションセンサーの値について

ataru2222

総合スコア272

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/08/13 09:40

参考書を見ながら、モーションセンサーについてのコードを勉強しています。
エラーコードの理由がわからなかったので質問させていただきます。

Swift

1 2import UIKit 3import CoreMotion 4 5class ViewController: UIViewController { 6 7 //ジャイロスコープの測定値 8 @IBOutlet weak var xGyroLabel: UILabel! 9 @IBOutlet weak var yGyroLabel: UILabel! 10 @IBOutlet weak var zGyroLabel: UILabel! 11 12 //加速度の測定値 13 @IBOutlet weak var xAccelLabel: UILabel! 14 @IBOutlet weak var yAccelLabel: UILabel! 15 @IBOutlet weak var zAccelLabel: UILabel! 16 17 //加速度のベクトル 18 @IBOutlet weak var xGravityLabel: UILabel! 19 @IBOutlet weak var yGravityLabel: UILabel! 20 @IBOutlet weak var zGravityLabel: UILabel! 21 22 //姿勢の測定値 23 @IBOutlet weak var pitchLabel: UILabel! 24 @IBOutlet weak var rollLabel: UILabel! 25 @IBOutlet weak var yawLabel: UILabel! 26 27 //モーションマネージャーを作る 28 let motionManager = CMMotionManager() 29 30 31 32 33 34 override func viewDidLoad() { 35 super.viewDidLoad() 36 // Do any additional setup after loading the view. 37 38 //キューを実行する感覚 (秒) 39 motionManager.deviceMotionUpdateInterval = 0.1 40// ★★★★★ キューで実行するクロージャ 41 let hander: CMDeviceMotionHandler = {(motionData: CMDeviceMotion?, error: NSError?) -> Void in self.motionAnimation(motionData: motionData, error: error as NSError?) 42 } 43 44 //更新で実行するキューを登録してモーションセンサーをスタートする 45 motionManager.startDeviceMotionUpdates(to: OperationQueue.main, withHandler: hander) 46 } 47 48 //デバイスモーションセンサーで定期的に実行するメゾット 49 func motionAnimation(motionData: CMDeviceMotion?, error: NSError?) { 50 if let motion = motionData { 51 52 //ジャイロスコープ(回転角速度) 53 //X軸回り回転角速度 54 var gyroX = motion.rotationRate.x 55 gyroX = round(gyroX * 100) / 100 56 xGyroLabel.text = String(gyroX) 57 58 //Y軸回り回転角速度 59 var gyroY = motion.rotationRate.y 60 gyroY = round(gyroY * 100) / 100 61 yGyroLabel.text = String(gyroY) 62 63 //Z軸回り回転角速度 64 var gyroZ = motion.rotationRate.z 65 gyroZ = round(gyroZ * 100) / 100 66 zGyroLabel.text = String(gyroZ) 67 68 69 //加速度センサー(移動加速度) 70 //X軸方向加速度 71 var accelX = motion.userAcceleration.x 72 accelX = round(accelX * 1000) / 1000 73 xAccelLabel.text = String(accelX) 74 75 //Y軸方向加速度 76 var accelY = motion.userAcceleration.y 77 accelY = round(accelY * 1000) / 1000 78 yAccelLabel.text = String(accelY) 79 80 //Z軸方向加速度 81 var accelZ = motion.userAcceleration.z 82 accelZ = round(accelZ * 1000) / 1000 83 zAccelLabel.text = String(accelZ) 84 85 86 //重力ベクトル 87 //加速度のX成分 88 var gravityX = motion.gravity.x 89 gravityX = round(gravityX * 100) / 100 90 xGyroLabel.text = String(gravityX) 91 92 //加速度のY成分 93 var gravityY = motion.gravity.y 94 gravityY = round(gravityY * 100) / 100 95 yGyroLabel.text = String(gravityY) 96 97 //加速度のZ成分 98 var gravityZ = motion.gravity.z 99 gravityZ = round(gravityZ * 100) / 100 100 zGravityLabel.text = String(gravityZ) 101 102 103 //姿勢センサー(回転角度 ラジアン) 104 //ピッチ(X軸回り回転角度) 105 var pitch = motion.attitude.pitch 106 pitch = round(pitch * 100) / 100 107 pitchLabel.text = String(pitch) 108 109 //ロール(Y軸回り回転角度) 110 var roll = motion.attitude.roll 111 roll = round(roll * 100) / 100 112 rollLabel.text = String(roll) 113 114 //ヨー(Z軸回り回転角度) 115 var yaw = motion.attitude.yaw 116 yaw = round(yaw * 100) / 100 117 yawLabel.text = String(yaw) 118 119 120 121 } 122 } 123 124 125} 126 127

参考書の入力通りにいくと★★★★★の部分で
Cannot convert value of type '(CMDeviceMotion?, NSError?) -> Void' to specified type 'CMDeviceMotionHandler' (aka '(Optional<CMDeviceMotion>, Optional<Error>) -> ()')
このようなエラーが出てしまいます。

Fix機能を使って自動修正したら起動まではできたのですが、起動時に落ちてしまいました。
その時のエラーコードがこのようなものでした。
Could not cast value of type '(Swift.Optional<__C.CMDeviceMotion>, Swift.Optional<__C.NSError>) -> ()' (0x1db79dbb8) to '(Swift.Optional<__C.CMDeviceMotion>, Swift.Optional<Swift.Error>) -> ()' (0x1db79dcf0).

自分の今の技術では、全然理解することができなかったのでお力をお貸しください。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

let hander: CMDeviceMotionHandler = {(motionData: CMDeviceMotion?, error: NSError?) -> Void in self.motionAnimation(motionData: motionData, error: error as NSError?)
の最初のNSError?のNSを消せば大丈夫みたいです。

参考:swiftでモーションセンサーの値を取得する方法でエラーになるのを解決した

投稿2019/08/13 15:17

yuki84

総合スコア23

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ataru2222

2019/08/14 03:58

できました。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問