2015-03-28 2 views
0

Я только что завершил интеграцию библиотеки фотографий на основе Objective-C в мой код, но я застрял при попытке переписать код примера Objective-C в Быстро в одном месте, в частности. Вот код Objective-C, вызывающий проблему.Objective C Block - Convert Swift Not Working

__weak MHGalleryController *blockGallery = gallery; 

gallery.finishedCallback = ^(NSInteger currentIndex,UIImage *image,MHTransitionDismissMHGallery *interactiveTransition,MHGalleryViewMode viewMode){ 

    NSIndexPath *newIndex = [NSIndexPath indexPathForRow:currentIndex inSection:0]; 

    [self.tableView scrollToRowAtIndexPath:newIndex atScrollPosition:UITableViewScrollPositionMiddle animated:NO]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     UIImageView *imageView = [(ImageTableViewCell*)[self.tableView cellForRowAtIndexPath:newIndex] iv]; 
     [blockGallery dismissViewControllerAnimated:YES dismissImageView:imageView completion:nil]; 
    }); 

}; 

Мое предположение, что мне нужно установить переменную finishedCallback к закрытию с параметрами - по аналогии с блоком above.As такой я пытался сделать то же самое. Мой блок упоминается как переменная «closedBlockInputs» ниже.

weak var blockedGallery = gallery 
    var closingBlock = { 
     (currentIndex:NSInteger, image:UIImage, interactiveTransition: MHTransitionDismissMHGallery, viewMode: MHGalleryViewMode) ->() in 

    } 

    var tr = MHTransitionDismissMHGallery() 
    gallery.finishedCallback = closingBlock(1, UIImage(name:"temp"),tr,MHGalleryViewMode.OverView) 

Однако, когда я запускаю код, я получаю сообщение об ошибке, как:

() не конвертируются в Int, UIImage, MHTransitionDismissMHGallery, MHGalleryViewMode

Я довольно конечно, у меня есть общий поток вправо, просто отсутствует что-то ...

Любая помощь была бы принята с благодарностью ...

ответ

4

finishedCallback имеет тип (NSInteger, UIImage, MHTransitionDismissMHGallery, MHGalleryViewMode) ->(), то есть замыкание, которое принимает четыре входных параметра и возвращает Void. В вашем Swift код, вы вызоваclosingBlock и пытается присвоить его возврата значение (Void) для finishedCallback, поэтому ошибка говорит вам, что () (ака Void) не конвертируются в тип закупоривающего.

Стоит отметить несколько других вещей. UIImage(name: "temp") возвращает необязательный UIImage, но закрытие ожидается не факультативным UIImage. Инициализатор init?(name:) неисправен, так как может не быть файл изображения с указанным именем. Поэтому убедитесь, что вы разворачиваете опцию UIImage перед передачей ее в качестве параметра для закрытия.

Следующая вещь, которую следует учитывать, заключается в том, что типы параметров закрытия выводятся компилятором, поэтому нет необходимости их явно писать.

Кроме того, Swift разрешает сильные ссылочные циклы в замыканиях с использованием списков захвата, вместо того, чтобы объявлять отдельную версию переменной weak (см. Strong Reference Cycles for Closures на языке Swift для получения подробной информации об этом механизме).

Так что я бы ожидать, что ваш код, чтобы просто выглядеть в Swift:

gallery.finishedCallback = { [unowned gallery] currentIndex, image, interactiveTransition, viewMode in 
    // ... 
} 
+0

Хороший, ясный ответ. (проголосовало) –

+0

Отлично ... спасибо – mday