當我讀到由蘋果公司提供的斯威夫特文檔時,我發現了一些概念,我不清楚......快速關閉省略示例?
當一個封閉的類型是已知的,如回調委託,則可以省略類型其參數,返回類型或兩者。單語句閉包隱式返回其唯一語句的值。
let mappedNumbers = numbers.map({ number in 3 * number })
print(mappedNumbers)
這是什麼意思爲代表的回調?你能舉個例子嗎?如果兩者都被忽略,我們是否需要in
關鍵字?
當我讀到由蘋果公司提供的斯威夫特文檔時,我發現了一些概念,我不清楚......快速關閉省略示例?
當一個封閉的類型是已知的,如回調委託,則可以省略類型其參數,返回類型或兩者。單語句閉包隱式返回其唯一語句的值。
let mappedNumbers = numbers.map({ number in 3 * number })
print(mappedNumbers)
這是什麼意思爲代表的回調?你能舉個例子嗎?如果兩者都被忽略,我們是否需要in
關鍵字?
沒有什麼比這更簡單的了。在這種情況下,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")
}
它聲明參數類型可以從委託中推斷出來。委託是一種協議,您可以在其中定義方法參數的類型。這意味着,在實現委託方法時,編譯器已通過聲明的協議瞭解方法類型。
一個例子:
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(<)
每一步輸出相同的結果,它是由你來決定什麼是簡潔的,但在同一時間讀取。
所以你一直省略'animals.sort()'的括號嗎? – user7813604
'下載器。onDownloaded = { print(「Downloadloaded:\(data.count)B」) }'既然** Bool **類型的變量沒有被使用,那麼它也可以被忽略?編譯器知道'data'是** Data **類型的? – user7813604
@ user7813604哦,不,我的錯,對不起。你必須明確地使用'_,data in'來省略:) – Sulthan