Использование startDeviceMotionUpdates под Swift 3

Да, я видел предыдущий вопрос по этому поводу, но Я все еще не могу заставить это работать. Мой предыдущий код Swift2 был...

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

который назвал:

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

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


person Maury Markowitz    schedule 04.01.2017    source источник


Ответы (1)


Это должно сработать для вас, в Swift 3 всего несколько переименований.

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

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

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

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

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

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

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

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

motionMgr.startDeviceMotionUpdates(to: OperationQueue()) { deviceMotion, error in
    // ...
}
person nathangitter    schedule 04.01.2017
comment
Спасибо @nathan. Ключевым для меня был синтаксис замыкания, который мне было намного легче понять. Я просто поместил вызов func в завершающее замыкание, и все! - person Maury Markowitz; 04.01.2017
comment
motionMgr.startDeviceMotionUpdates (используя: CMAttitudeReferenceFrame.xTrueNorthZVertical, to: OperationQueue()) { deviceMotion, ошибка в self.handleMove (движение: deviceMotion, ошибка: ошибка)} - person Maury Markowitz; 04.01.2017