2017-01-04 5 views
2

Да, я видел previous question на этом, но я до сих пор не могу заставить это работать. Мой предыдущий код Swift2 был ...Использование startDeviceMotionUpdates под Swift 3

motionMgr.startDeviceMotionUpdatesToQueue(NSOperationQueue(), withHandler: handleMove) 

, который называется:

func handleMove(motion: CMDeviceMotion?, error: NSError?) { 
    ... 
} 

Это изменилось под Swift3, и теперь startDeviceMotionUpdatesToQueue использует замыкание. Я не могу для жизни понять, как назвать мой существующий метод. Я понимаю, что NSError стал Error и другими незначительными изменениями, но синтаксис вызова от закрытия меня очень смущает.

ответ

2

Это должно работать для вас, есть только несколько повторных namings в Swift 3.

motionMgr.startDeviceMotionUpdates(to: OperationQueue(), withHandler: handleMove) 

func handleMove(motion: CMDeviceMotion?, error: Error?) { 
    // ... 
} 

handler имеет тип CMDeviceMotionHandler, который определяется как typealias к закрытию:

typealias CMDeviceMotionHandler = (CMDeviceMotion?, Error?) -> Void 

Нам просто нужно предоставить замыкание (или функцию, поскольку функция является замыканием), которая принимает два параметра (a CMDeviceMotion? и Error?) и ничего не возвращает (Void).

В качестве альтернативы, можно обеспечить закрытие вместо функции следующим образом:

motionMgr.startDeviceMotionUpdates(to: OperationQueue(), withHandler: { deviceMotion, error in 
    // ... 
}) 

или использовать новый закрывающий трейлинг синтаксис:

motionMgr.startDeviceMotionUpdates(to: OperationQueue()) { deviceMotion, error in 
    // ... 
} 
+1

Спасибо @ Натан. Ключом для меня был завершающий синтаксис, который мне было гораздо легче понять. Я просто поставил func-вызов в трейлинг-закрытие, и это было так! –

+0

motionMgr.startDeviceMotionUpdates (с использованием: CMAttitudeReferenceFrame.xTrueNorthZVertical, к: OperationQueue()) { \t \t \t \t deviceMotion, ошибка в self.handleMove (движение: deviceMotion, ошибка: ошибка) \t \t \t} –