2015-06-06 19 views
0

我試圖創建一個塊,我可以輸入參數但沒有返回(類型塊void)。我們知道,在沒有參數,不返回任何一個塊的結構是這樣的:字符串不是()的子類型

var block:() ->() = { 
//Hello World goes here 
} 

與參數塊的情況,但不返回任何東西,我們可以使用這個命令:

var bloco7: (String) ->() = { 
    //Hello World goes here 
} 

但我們有兩個問題:第一個是,這個代碼不工作,第二個是,如果我們所說的這樣一個臨時變量的代碼只適用:

var bloco7: (String) ->() = { 
    $0//I only need to call 
    //Hello World goes here and all the things OK 
} 

我想知道w^HY發生這種情況,它似乎並沒有太大的意義......

回答

1

這裏有兩個部分。

首先,我們宣佈關閉的類型:

var bloco7: (String) ->() 

bloco7是一個變量,其類型爲(String) ->()(封閉它接受一個字符串,並返回nil我們沒有定義的參數的名稱這裏的參數由「封閉文字語法」,所以來講話命名

所以,如果我們希望有一個內嵌關閉,我們可以以後:

var bloco7: (String) ->() = { 
    yourArgument in // <-- here we named the parameter, it's called 'yourArgument' 
    println(yourArgument) 
} 

但重要的是要注意,當我們聲明bloco7及其類型時,我們沒有定義變量的名稱。請記住,我們可以將方法和函數分配給閉包變量。

例如,鑑於這一功能:

func sayHello(name: String) -> Void { 
    println("Hello, " + name + "!") 
} 

我們其實可以有bloco7點這個功能:

bloco7 = sayHello 

而現在,下面兩行實際上做同樣的事情:

sayHello("World") 
bloco7("World") 

這裏重要的外觀是參數名稱是與封閉類型無關。參數名稱是我們分配給變量的值的一部分,而不是其類型的一部分。

1

在第一,你需要做的像那朵

var bloco7: (String) ->() = { 
    input in 
    //Do something with input 
} 

bloco7類型:(String)->()

{}類型:() ->()

他們不匹配,所以你得到一個錯誤

但是在第二種方式中,你使用$ 0時,迅速知道它有一個輸入時,它會match.Match $ 0輸入String,所以類型是正確的

相關問題