как получить список плиток вашего приложения, уже находящихся на Microsoft Band 1

Я создаю приложение Microsoft Band 1 для iOS с помощью Swift Эта функция в документации вызывает у меня косоглазие. Пожалуйста помоги.

Я знаю, что функции могут действовать как типы в Swift, т.е.

var exampleFunction: (String, Int) -> String

это функция, которая принимает два параметра, строку и целое число, и возвращает строку.

Метод, на который я смотрю, говорит следующее в Xcode (язык Swift):

tilesWithCompletionHandler(completionHandler: (([AnyObject]!, NSError!) -> Void)!

что, как я полагаю, говорит о том, что titlesWithCompletionHandler принимает параметр, который является функцией типа [AnyObject]!, NSError!) -> Void. Я не уверен в том, что ()! окружает все это, хотя я знаю, что это вытесняет значение из необязательного. это тоже трудно понять .

на сайте документации это написано на Objective-c, который показывает это как определение метода:

[self.client.tileManager tilesWithCompletionHandler:^(NSArray *tiles, NSError *error) {
   if (error){
     // handle error
}}];

то, что я попытался, - это построить функцию, которая является типом, который запрашивает:

//I had to create this function to match the parameter that the tilesWithCompletionHandler method required
func errorFunction(tileArray: [AnyObject]!, error: NSError!) -> Void {
    print("hello")
    if((error) != nil) {
        //handle error
        print("error was not nil, meaning an error occurred... :(")
    }
    else {
        print("i got here")
        self.tileArray = tileArray
    }
}

затем я создал тип и присвоил его этой функции следующим образом (что исправило ошибки, о которых Xcode беспокоился, когда я вызывал метод, который пытался использовать):

let customFunction: (([AnyObject]!, NSError!) -> Void)! = errorFunction

часть ()! вокруг типа все еще смущает меня, хотя

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

myBand.tileManager.tilesWithCompletionHandler( customFunction )

Изменить: ошибка не была связана с проблемой. Операторы печати печатаются сейчас, но я попадаю в поток ошибок.

Правильно ли я поступаю?

Кроме того, я пытаюсь понять, как обрабатывать ошибочную часть параметров. Нужно ли мне использовать

do {
    try //some code I need to figure out what to write
} catch let error as NSError {
    //code to handle error
}

Просто в этом методе много чего нужно, чтобы я полностью понял. Любая помощь приветствуется. Спасибо за ваше время!


person Coty Embry    schedule 22.12.2015    source источник
comment
Это блок (в Objective-C). Вопросов о том, как переводить блоки в Swift, много.   -  person Larme    schedule 22.12.2015


Ответы (2)


Ваша обработка ошибок кажется правильной в errorFunction. Просто измените оператор печати, чтобы он также распечатывал объект ошибки, чтобы увидеть, в чем заключается фактическая ошибка.

print("error was not nil, meaning an error occurred... :( \(error)")

Вы можете дополнительно просмотреть error.code и добавить логику в свое приложение для его обработки. В MSBErrorTypes.h есть список возможных кодов ошибок, и, скорее всего, ваш код будет в диапазоне 300.

person Manjit Riat    schedule 23.12.2015

После комментария Ларме мне удалось заставить его работать с закрытием в Swift. Мне любопытно, сработает ли метод, который я использовал в своем вопросе...

Это то, что я сделал после обновления моего оператора печати, который также был предложен, что позволило мне узнать, что вы также можете печатать ошибки таким образом! :

    myBand.tileManager.tilesWithCompletionHandler( {(tiles:[AnyObject]!, error: NSError!) -> Void in
        if((error) != nil) {
            //handle error
            print("Error in .tilesWithCompletionHandler: \(error)")
        }
    })

Это просто замыкание, которое, по-видимому, эквивалентно блоку в Objective-c, о котором я до сих пор не знал (блочная часть).

Спасибо всем за помощь!

person Coty Embry    schedule 23.12.2015