2017-05-31 68 views
0

當我讀到由蘋果公司提供的斯威夫特文檔時,我發現了一些概念,我不清楚......快速關閉省略示例?

當一個封閉的類型是已知的,如回調委託,則可以省略類型其參數,返回類型或兩者。單語句閉包隱式返回其唯一語句的值。

let mappedNumbers = numbers.map({ number in 3 * number }) 
print(mappedNumbers) 

這是什麼意思爲代表的回調?你能舉個例子嗎?如果兩者都被忽略,我們是否需要in關鍵字?

回答

1

沒有什麼比這更簡單的了。在這種情況下,delegate的含義是閉包被用作變量。請看下面的例子:

class Downloader { 
    var onDownloaded: ((Data) -> Void)? 
    func startDownloading() { 
     ... 
    } 
} 

用作:

let downloader = Downloader() 
downloader.onDownloaded = { data in 
    print("Downloaded: \(data.count) B") 
} 
downloader.startDownloading() 

正如你所看到的,我沒有不指定類型或在封閉的返回值,因爲表達式的左側( .onDownloaded =)提供了它們。

這同樣適用於方法的參數:

func startDownloading(onDownloaded: ((Data) -> Void)?) { 
    ... 
} 

但是,我們仍然需要in在封閉。關鍵字將參數名稱與封閉體分開。當然,我們可以使參數匿名:

downloader.onDownloaded = { 
    print("Downloaded: \($0.count) B") 
} 
+0

'下載器。onDownloaded = { print(「Downloadloaded:\(data.count)B」) }'既然** Bool **類型的變量沒有被使用,那麼它也可以被忽略?編譯器知道'data'是** Data **類型的? – user7813604

+1

@ user7813604哦,不,我的錯,對不起。你必須明確地使用'_,data in'來省略:) – Sulthan

1

它聲明參數類型可以從委託中推斷出來。委託是一種協議,您可以在其中定義方法參數的類型。這意味着,在實現委託方法時,編譯器已通過聲明的協議瞭解方法類型。

一個例子:

let sortedAnimals = animals.sort { (one: String, two: String) -> Bool in 
    return one < two 
} 

第一簡化有關的參數。類型推理系統可以計算參數的類型在封閉:

let sortedAnimals = animals.sort { (one, two) -> Bool in return one < two } 

返回類型也可以推斷出:

let sortedAnimals = animals.sort { (one, two) in return one < two } 

的$ I符號可以替換爲參數名:

let sortedAnimals = animals.sort { return $0 < $1 } 

在單個語句關閉中,可以省略return關鍵字:

let sortedAnimals = animals.sort { $0 < $1 } 

對於字符串,有一個比較功能,這使得字符串比較更短:

let sortedAnimals = animals.sort(<) 

每一步輸出相同的結果,它是由你來決定什麼是簡潔的,但在同一時間讀取。

+0

所以你一直省略'animals.sort()'的括號嗎? – user7813604