2015-03-13 3 views
0

У меня есть следующие Objective-C синтаксис:Swift Эквивалент блока Objective-C?

@property (nonatomic, copy) void(^cropBlock)(UIImage *image); 

- (void)cropAction { 
    if (self.cropBlock) { 
     self.cropBlock(self.imageScrollView.capture); 
    } 
} 

Мне нужно эквивалентный синтаксис Swift, и я попробовал:

var cropBlock: (UIImage) -> Void 

private func cropAction() { 
    if (self.cropBlock != nil) { 
     self.cropBlock(self.imageScrollView.capture); 
    } 
} 

Но я получил ошибку:

(UIImage) -> Void' is not convertible to 'UInt8 

Что является правильным представлением Swift?

+0

@Stuart Я прочитал эту книгу. – confile

+2

@confile ОК здорово! Ответы и объяснения на ваши вопросы лежат на этих страницах; иногда полезно обратиться к ним, когда возникает конкретный вопрос. Я бы сказал, что, основываясь на нескольких ваших вопросах, это может помочь вам оглянуться назад на опции, тип вывода, свойства и определенные основы языка (например, нет необходимости в точках с запятой в конце операторов, круглых скобках в операциях потока управления, 'self' для ссылки на переменные экземпляра). Или вы можете начать с более простого кодирования Swift, чтобы справиться с языком? – Stuart

ответ

4
var cropBlock: ((UIImage?) -> Void)? 

private func cropAction() { 
    self.cropBlock?(self.imageScrollView.capture()) 
} 

Если cropBlock может быть nil, она должна быть Optional.

А также если self.imageScrollView.capture может быть nil, первый параметр cropBlock должен быть Optional.

self.cropBlock?(self.imageScrollView.capture()) является ярлык:

if let fn = self.cropBlock { 
    fn(self.imageScrollView.capture()) 
} 
0

Определить его как typealias в Swift:

typealias CropBlock = (image : UIImage) ->() 

Для получения дополнительной информации вы можете прочитать официальную документацию для typealias here.

+1

Это, вероятно, подходит, но я бы предположил, что это должно быть 'CropBlock', так как в Swift для обычных типов обычно начинается с большой буквы. – Stuart

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