簡體   English   中英

Core Motion Swift Closure問題

[英]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

}

CMMotionManager

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM