2015-06-06 28 views
0

我這裏有這個閉合,來檢查,如果第一個值大於第二個,如果真的返回一個布爾值:閉包用速記不工作

var bloco12: (Int, Int -> Bool) -> Bool = { 

    return $1($0) 
} 

println(bloco12(32, {$0 > 10})) 

但我瞭解到,有另一種方式來簡化這隻能使用符號>,就像這樣:

bloco12(32, >) 

但這代碼不起作用,爲什麼呢?

+0

函數簽名不匹配。 'bloco12'需要一個'Int'和一個閉包,它需要一個'Int'並返回一個'Bool'。你試圖給它一個'Int'和一個需要2個參數並返回一個'Bool'的函數。 – vacawama

+0

@vacawama有趣...在很多教程中,他們創造了一個功能來做到這一點....所以唯一的形式是隻使用符號>正在創建一個函數? – LettersBa

+0

'>'本身代表'(Int,Int) - > Bool'。儘管有許多'>'功能。還有'(Double,Double) - > Bool','(Float,Float) - > Bool',但它們都帶有2個參數並返回一個'Bool'。 – vacawama

回答

2

請注意,>函數有兩個參數並返回Bool。你的例子不起作用,因爲你試圖將>傳遞給一個只有一個參數的函數。我已更改您的示例以顯示您如何才能通過>

var bloco12: (Int, Int, (Int, Int) -> Bool) -> Bool = { 

    return $2($0, $1) 
} 

println(bloco12(32, 33, {$0 > $1})) // prints "false" 
println(bloco12(32, 33, >))   // prints "false" 
println(bloco12(32, 33, <))   // prints "true" 
println(bloco12(32, 33, ==))   // prints "false" 
+0

謝謝你,現在我明白了 – LettersBa