2014-06-11 86 views
11

我在新的Swift項目中使用Objective-C Firebase框架時遇到了問題。我主要來自C#背景,所以Swift閉包語法還沒有明確。用Swift處理Objective-C塊

下面是Objective-C的代碼工作,f是火力地堡對象

[f observeEventType:FEventTypeValue withBlock:^(FDataSnapshot *snapshot) { 
    NSLog(@"%@ -> %@", snapshot.name, snapshot.value); 
}]; 

XCode的自動提示這句法,我還沒有找到一個有效的解決方案如何。

f.observeEventType(FEventTypeValue, withBlock: ((FDataSnapshot!) -> Void)?) 

我想分配FDataSnapshot數據作爲Objective-C示例正在做的變量。由於

+2

Swift中的閉包類似於C#中的匿名方法。例如,'動作'轉換爲'(T) - >空白'並且'Func '變成'(TArg) - > TResult'。 – Erik

+0

謝謝有幫助的SiLo – Beanwah

回答

14

以下是雨燕相當於:

f.observeEventType(FEventTypeValue, withBlock: { 
    snapshot in 
    println("\(snapshot.name) -> \(snapshot.value)") 
}) 

這裏的關鍵是in關鍵字參數分配給封閉變量

+0

我想知道你是否可以看看這個:https://gist.github.com/acegreen/05282d20eb45de8d30d5 –

1

斯威夫特塊是用Objective-C的塊可互換的,所以它應該是這樣的:

f.observeEventType(FEventTypeValue, withBlock: { 
    snapshot in 
    println("\(snapshot.name) -> \(snapshot.value)") 
}) 
4

要扔在隱含的名稱和尾部關閉,您可以使用:

f.observeEventType(FEventTypeValue) { 
    println("\($0.name) -> \($0.value)") 
} 
+0

雖然它不需要最後一個參數名嗎? – Chuck

+1

不,它使用隱含的命名和輸入,只要有一個尾隨塊,並將'{'與'''放在同一行上即可) –

+0

但是,它如何知道'withBlock:'參數的名稱?我認爲命名參數仍需要命名。這是記錄在任何地方? – Chuck