2015-08-11 3 views
0

Я пробовал в течение 15 минут, пытаясь понять, как использовать этот код из книги, написанной до Swift 2, в приложении Xcode 7 в Swift 2. Вот фрагмент кода:Преобразование Swift 1.2 в Swift 2

self.coreMotionManager.accelerometerUpdateInterval = 0.3 
self.coreMotionManager.startAccelerometerUpdatesToQueue(NSOperationQueue(), withHandler: { 

    (data: CMAccelerometerData!, error: NSError!) in 

        if let constVar = error {  

println("There was an error") 
        } 
        else { 

            self.xAxisAcceleration = CGFloat(data!.acceleration.x) 
        } }) 

Я получаю ошибку: «Невозможно вызвать 'startAccelerometerUpdatesToQueue' со списком аргументов типа '(NSOperationQueue, withHandler: (CMAccelerometerData !, NSError) -> _)'

+0

Действительно ли вы форматируете свой код? Вопросы читаемости. – zaph

+0

@zaph Нет, я сделал все, что мог, с моим iPhone, так как нет Wi-Fi, где я остаюсь, поэтому я не могу использовать свой Mac. – RedEagle2000

+0

@matt Я набрал его ТОЧНО, как он появился в книге в Swift 1.2, чтобы никого не смущать. Вопрос обновлен с информацией об ошибке. – RedEagle2000

ответ

3

вопрос заключается в том, что SDK iOS был дополнительно проверен на отсутствие значений, поэтому те параметры, которые неявно разворачиваются в образце кода из вашей книги, теперь являются старыми старыми опциями (т.е. используют ?, а не !):

coreMotionManager.accelerometerUpdateInterval = 0.3 
coreMotionManager.startAccelerometerUpdatesToQueue(NSOperationQueue()) { (data: CMAccelerometerData?, error: NSError?) -> Void in 
    guard data != nil else { 
     print("There was an error: \(error)") 
     return 
    } 

    self.xAxisAcceleration = CGFloat(data!.acceleration.x) 
} 

Или, проще говоря, пусть компилятор вывести типы параметров закрытия:

coreMotionManager.accelerometerUpdateInterval = 0.3 
coreMotionManager.startAccelerometerUpdatesToQueue(NSOperationQueue()) { data, error in 
    guard data != nil else { 
     print("There was an error: \(error)") 
     return 
    } 

    self.xAxisAcceleration = CGFloat(data!.acceleration.x) 
} 

И, как вы видите выше, так как вы используете Swift 2 , вы можете также использовать синтаксис guard.

+0

Спасибо, @Rob, больше ошибок компилятора! – RedEagle2000

+0

Кстати, если вы смотрите на много кода Swift 1.2, вы, вероятно, увидите много таких проблем. Если вы это сделаете, вы можете либо использовать «завершение кода» в Xcode (и он покажет вам, какой тип параметров), либо обратиться к документации для рассматриваемого метода (сверление в тип закрытия 'CMAccelerometerHandler'). В любом случае, просто сверните параметры параметров какао и/или параметры закрытия, и дважды проверьте нулеумие (например, варианты просмотра). удачи! – Rob

Смежные вопросы