Swift: 2 последовательных закрытия / блока

#xcode #swift #xcode6

#xcode #swift #xcode6

Вопрос:

Согласно приведенным здесь документам: https://www.parse.com/docs/ios_guide#files-progress/iOS

это предлагаемый синтаксис для обработки сохранения файла с помощью блока завершения и progressBlock.

 let str = "Working at Parse is great!"
let data = str.dataUsingEncoding(NSUTF8StringEncoding)
let file = PFFile(name:"resume.txt", data:data)
file.saveInBackgroundWithBlock {
  (succeeded: Bool!, error: NSError!) -> Void in
  // Handle success or failure here ...
}, progressBlock: {
  (percentDone: Int) -> Void in
  // Update your progress spinner here. percentDone will be between 0 and 100.
}
  

Однако XCode 6.2 выдает эту ошибку:
Последовательные инструкции в строке должны разделяться символом ‘;’

в этой строке:

 }, progressBlock: {
  

Кто-нибудь знает, как правильно использовать progressBlock в этом сценарии?

Правка 1: Вот пример в Obj C:

 NSData *data = [@"Working at Parse is great!" dataUsingEncoding:NSUTF8StringEncoding];
PFFile *file = [PFFile fileWithName:@"resume.txt" data:data];
[file saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
  // Handle success or failure here ...
} progressBlock:^(int percentDone) {
  // Update your progress spinner here. percentDone will be between 0 and 100.
}];
  

Правка 2:

Еще одна попытка, другая ошибка:

Еще одна попытка, еще одна ошибка

Правка 3: Исходный код, но с CInt в соответствии с предложением комментария

введите описание изображения здесь

Комментарии:

1. Под Xcode 6.2 вы имеете в виду Xcode 6 beta 2?

Ответ №1:

Я определил класс в Objective C с сигнатурой метода:

 - (void)saveInBackgroundWithBlock:(void(^)(BOOL succeeded, NSError *error))block progressBlock:(void(^)(int percentDone))progressBlock;
  

Я могу назвать это так из Swift:

 let file = Test()
file.saveInBackgroundWithBlock({(success: Bool, error: NSError!) -> Void in
        NSLog("1")
    }, progressBlock: { (percentage: CInt) -> Void in
        NSLog("2")
    })
  

Комментарии:

1. block: может быть ненужным, поскольку это первый параметр.

2. «Дополнительный аргумент ‘block’ в вызове»

3. Попробуйте без «блокировать:».

4. «Дополнительный аргумент в вызове»

5. Да. Единственное отличие в том, что я использовал CInt в качестве параметра процент выполнения.

Ответ №2:

Вам не хватает функции () для аргументов метода. Должно быть:

 file.saveInBackgroundWithBlock({ (succeeded: Bool!, error: NSError!) -> Void in
    // Handle success or failure here ...
}, progressBlock: {
    (percentDone: Int) -> Void in
    // Update your progress spinner here. percentDone will be between 0 and 100.
})
  

(Примечание: при вызове Objective-C из кода Swift Xcode преобразуется (при завершении кода) int в CInt и NSInteger в Int ).

Комментарии:

1. Дополнительный аргумент ‘progressBlock’ в вызове