2014-06-10 96 views
2

我在嘗試將舊的遊戲應用程序在obj-c中構建爲新的swift代碼。我有一些理解swift閉包的問題,​​以及如何在「startAccelerometerUpdatesToQueue」方法中使用它們。Core Motion Swift Closure問題

我已經以這種方式初始化運動經理

motionManager!.accelerometerUpdateInterval = (1/40) 

然後在我的視圖控制器的viewDidLoad中

var queue:NSOperationQueue 
motionManager?.startAccelerometerUpdatesToQueue(queue, withHandler: {(accelerometerData :  CMAccelerometerData, error : NSError) in 


}) 

的「startAccelerometerUpdatesToQueue」是給我的錯誤,我敢肯定我不明白正確的閉包語法。

任何想法?

+3

什麼是錯誤 –

回答

6

實際上,你剛剛得到的簽名是錯的 - 你的閉包的參數需要是可選項(因爲它們是從Objective-C傳遞的,它們可能是nil)。因此,您提供的參數與現有的方法簽名不匹配,因此您會收到錯誤消息。

看看在iOS 8 API docs,他們還提供斯威夫特簽名:

func startAccelerometerUpdatesToQueue(_ queue: NSOperationQueue!, 
          withHandler handler: CMAccelerometerHandler!) 

CMAccelerometerHandler被定義爲

typealias CMAccelerometerHandler = (CMAccelerometerData!, NSError!) -> Void 

因此,您的通話應該是:

motionManager?.startAccelerometerUpdatesToQueue(queue, withHandler: {(accelerometerData :  CMAccelerometerData!, error : NSError!) in 


}) 

就像任何使用閉包的函數/方法一樣ST的說法,你可以把它從參數列表和調用後寫(後封語法 - 這個例子也留下了類型,因爲他們可以推斷,但這是可選的):

motionManager?.startAccelerometerUpdatesToQueue(queue) { accelerometerData, error in 

} 
+0

謝謝了很多! – Dodgson86

0

CMMotionManager

對象是iOS提供的運動服務的入口。這些服務提供了一個應用程序加速度計數據,旋轉率數據,磁力計數據,和其他設備運動數據,如態度。這些類型的數據始於設備的加速計和(在某些型號上)其磁力計陀螺儀

處理運動更新以指定的間隔

要接收在特定時間間隔的運動數據,應用程序調用接受一個操作隊列中的「開始」方法(實例NSOperationQueue)和特定類型的塊處理程序用於處理這些更新。運動數據被傳遞到塊處理程序。更新的頻率由「間隔」屬性的值決定。

  • 加速度計。

設置accelerometerUpdateInterval屬性以指定更新間隔。調用startAccelerometerUpdatesToQueue:withHandler:方法,傳遞一個類型爲的CMA加速度計手柄。加速計數據被傳遞到塊中作爲CMA加速計數據對象。

  • 陀螺儀。

  • 磁力計。

  • 設備運動。

用於向塊處理程序提供加速計更新的時間間隔(以秒爲單位)。

宣言

SWIFT

VAR accelerometerUpdateInterval:NSTimeInterval

討論 系統將提供加速度更新到startAccelerometerUpdatesToQueue指定的塊處理程序:withHandler:定期由值o確定f這個屬性。

間隔單位以秒爲單位。該屬性的值限制爲最小值和最大值;最大值由硬件支持的最大頻率決定。如果您的應用程序對加速度數據的時間間隔敏感,則應始終檢查交付的實例的時間戳,以確定實際更新時間間隔。

可用性 適用於iOS 4.0及更高版本。