[英]Core Motion Swift Closure issue
我正在嘗試將obj-c中構建的舊游戲應用程序轉換為新的swift代碼。 我有一些問題了解swift閉包以及如何在“startAccelerometerUpdatesToQueue”方法中使用它們。
我已經用這種方式初始化了運動管理器
motionManager!.accelerometerUpdateInterval = (1/40)
然后在我的視圖控制器的viewdidload中
var queue:NSOperationQueue
motionManager?.startAccelerometerUpdatesToQueue(queue, withHandler: {(accelerometerData : CMAccelerometerData, error : NSError) in
})
“startAccelerometerUpdatesToQueue”給了我一個錯誤,我很確定我不理解正確的閉包語法。
有任何想法嗎?
實際上,你只是簽名錯誤 - 你的閉包的參數需要是選項(因為它們是從Objective-C傳遞的,它們可能是nil
)。 因此,您提供的參數與現有方法簽名不匹配,因此您會收到錯誤。
看看iOS 8 API文檔 ,它們還提供Swift簽名:
func startAccelerometerUpdatesToQueue(_ queue: NSOperationQueue!,
withHandler handler: CMAccelerometerHandler!)
和CMAccelerometerHandler
定義為
typealias CMAccelerometerHandler = (CMAccelerometerData!, NSError!) -> Void
因此,您的電話應該是:
motionManager?.startAccelerometerUpdatesToQueue(queue, withHandler: {(accelerometerData : CMAccelerometerData!, error : NSError!) in
})
和任何以閉包作為最后一個參數的函數/方法一樣,你可以將它從參數列表中刪除並在調用后寫入它(尾隨閉包語法 - 這個例子也省略了類型,因為它們可以被推斷出來,但這是可選的):
motionManager?.startAccelerometerUpdatesToQueue(queue) { accelerometerData, error in
}
object是iOS提供的運動服務的入口。 這些服務為應用提供加速計數據,旋轉速率數據, 磁力計數據和其他設備運動數據,如姿態。 這些類型的數據源自設備的加速度計和(在某些型號上)其磁力計和陀螺儀 。
為了以特定間隔接收運動數據,app調用“start”方法,該方法采用操作隊列( NSOperationQueue的實例)和特定類型的塊處理程序來處理這些更新。 運動數據被傳遞到塊處理程序中。 更新頻率由“interval”屬性的值確定。
設置accelerometerUpdateInterval屬性以指定更新間隔。 調用startAccelerometerUpdatesToQueue:withHandler:方法,傳入一個CMAccelerometerHandler類型的塊。 加速度計數據作為CMAccelerometerData對象傳遞到塊中。
陀螺儀。
磁力。
設備運動。
宣言
迅速
var accelerometerUpdateInterval:NSTimeInterval
討論系統為startAccelerometerUpdatesToQueue:withHandler中指定的塊處理程序提供加速度計更新:以此屬性的值確定的固定間隔。
間隔單位以秒為單位。 此屬性的值上限為最小值和最大值; 最大值由硬件支持的最大頻率決定。 如果您的應用程序對加速數據的間隔敏感,則應始終檢查已傳遞的CMAccelerometerData實例的時間戳,以確定真正的更新間隔。
可用性適用於iOS 4.0及更高版本。
import UIKit
import CoreMotion
class ViewController: UIViewController {
let motionManager = CMMotionManager()
var timer: Timer!
override func viewDidLoad() {
super.viewDidLoad()
motionManager.startAccelerometerUpdates()
motionManager.startGyroUpdates()
motionManager.startMagnetometerUpdates()
motionManager.startDeviceMotionUpdates()
timer = Timer.scheduledTimer(timeInterval: 3.0, target: self, selector: #selector(ViewController.update), userInfo: nil, repeats: true)
}
@objc func update() {
if let accelerometerData = motionManager.accelerometerData {
print(accelerometerData)
}
if let gyroData = motionManager.gyroData {
print(gyroData)
}
if let magnetometerData = motionManager.magnetometerData {
print(magnetometerData)
}
if let deviceMotion = motionManager.deviceMotion {
print(deviceMotion)
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.