2015-03-13 54 views
0

我有以下的Objective-C語法:Objective-C塊的Swift Equivalent?

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

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

我需要雨燕相當的語法和我嘗試:

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 2015-03-13 09:42:15

+2

@confile好的!你的問題的答案和解釋在這些頁面中;有時在出現具體問題時回頭查看它們會有幫助。我會說,基於你的幾個問題,它可能會幫助你回顧可選項,類型推理,屬性和某些語言基礎(例如,在語句結尾不需要分號,控制流語句中的括號,「自我」以引用實例變量)。或者,你可以從一些簡單的Swift編碼開始,掌握這門語言? – Stuart 2015-03-13 10:20:02

回答

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:

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

欲瞭解更多信息,你可以閱讀typealias here官方文檔。

+1

這可能是合適的,但我建議它應該是'CropBlock',因爲在Swift中傳統類型以大寫字母開頭。 – Stuart 2015-03-13 09:50:59