Nguồn

https://medium.com/ios-os-x-development/introduction-to-closures-in-swift-3-1d46dfaf8a20

Khái niệm:

Mình xin trích dẫn nguyên văn khái niệm :

Apple, what are closures?
Closures are self-contained blocks of functionality that can be passed around and used in your code.
— Apple
Don’t worry if that make no sense. At first, it probably sounds like:
Closures are self-contained bunch of words passed around like a damn basketball. In case you don’t know, there happen to be a basketball court in the Playground. Go check it out.
— Apple

Mục đích

Giới thiệu về closure: What, How and Where

What: Closure là gì?

Closure có 3 hình thức

  1. Global functions: Hàm toàn cục
  2. Nested functions: Hàm lồng nhau
  3. Closures expression: Biểu thức closures

2 hình thức đầu là trường hợp đặc biệt của closure. Mình sẽ giới thiệu ở bài tiếp theo
Nguồn
https://medium.com/ios-os-x-development/master-functions-in-swift-3-d2f684f1dc92#.t0p2brgme

Khi nói về closure trong Swift, chúng ta thường ám chỉ đến biểu thức closures. Để nói về bạn nhớ closure là gì thì minh nghĩ câu này sẽ giúp ích

Closures are headless functions.

Closures là các functions không tên.

Closures là các functions khôngkhông có từ khoá func và cũng không có tên. Hay còn được biết đến là các anonymous functions (Hàm ẩn). Chúng ta không thể gọi nó giống như function vì chúng không có tên. Chúng ta sử dụng nó trong sự kết hơp với nhưng yếu tố khác.

Cú pháp

{ ( parameters ) -> return type in
    code
}

Cú pháp rất đơn giản phải không ạ.

So sánh giữa function và closure

Dưới đây là sự khác nhau cần nhớ khi nói đến function và closure:

Function

  • tên
  • func
  • Không có in

Closure

  • Không có tên
  • Không có func
  • in

Định nghĩa

Function
func giveAFunc() {}
Biến chứa closure
var giveNoFunc = { () -> () in }

Chú ý: Closure chúng ta bắt đầu bởi kí tự { và kết thúc bởi }. Chúng ta sẽ lưu giữ closure bên trong một biến để chúng ta có thể gọi nói.

Gọi closure

Gọi function
giveAFunc()
Gọi Closure
giveNoFunc()

Chúng ta thấy việc gọi là giống nhau. Tiếp theo chúng ta xem làm thể nào để chúng ta có thể biến một function thành một closure.

Chuyển Function thành closure

Hãy chuyễn sayHello thành một closure

Function sayHello

func sayHello(name: String) -> String {
  return "Hello (name)"
}

Các bước để chuyển về closure

  1. Loại bỏ dấu ngoặc
func sayHello(name: String) -> String 
  return "Hello (name)"
  1. Thêm từ khoá in vào giữa các đối số và thân hàm
func sayHello(name: String) -> String in
  return "Hello (name)"
  1. Loại bỏ từ khoá func và tên hàm
(name: String) -> String in
  return "Hello (name)"
  1. Bao đóng nó bởi cặp ngoặc nhọn
{ (name: String) -> String in
  return "Hello (name)"
}

Đã xong. Đơn giản phải không nào :v

Chúng ta có thể gán biến cho closure để có thể gọi nó giống như một function

var sayHello = { (name: String) -> String in
  return "Hello (name)"
}

CALL

sayHello("Ha Van Duc")

Where are closures: Closure sử dụng ở đâu

Ở một bài topic mọi người thường bỏ qua việc closure sử dụng ở đâu khi nói về nó. Vậy câu trả lời là gì

Everywhere

Closures bắt nguồn từ sâu bên trong của ngôn ngữ Swift. Trường hợp sử dụng nhiều nhất là trong các blocks/callback, higher order functions và syntactic sugars

Tóm lại

Chúng ta đã giới thiệu qua về closure như là nó là gì, trông nó như thế nào, chúng hình thành ra sao hay đơn gian là nó ở đâu.

Nếu bạn có câu hỏi gì về closure muốn mình giải đáp hay tìm hiểu có thể comment bên dưới. Nếu mình research được sẽ cố gắng trả lời bạn. Thanks