Hướng dẫn sử dụng Swift Closure
Công ty Vĩnh Cửu tuyển dụng lập trình viên Java

1- Closure là gì?

Closure: Về mặt ngữ nghĩa là một "Bao đóng", nó gần giống với một khối lệnh trong C hoặc Object-C. Closure là một khối lệnh đặc biệt, nó có thể có 0 hoặc nhiều tham số, và có thể có kiểu trả về.
Để đơn giản bạn hãy xem một khai báo dưới đây, bạn có thể đoán được ý nghĩa của nó?
Các khai báo ở trên có thể được giải thích bởi hình minh họa dưới đây:
Đây là một cú pháp khai báo biến với kiểu dữ liệu, và gán giá trị cho biến mà bạn đã quen thuộc:
MyFirstClosure.swift
import Foundation


// Khai báo biến myVar1, với kiểu dữ liệu, và gán giá trị.

var myVar1 : () -> () =  {
   
   print("Hello from Closure 1");
}


// Khai báo biến myVar2, với kiểu dữ liệu, và gán giá trị.

var myVar2 : () -> (String)  = { () -> (String) in

   return "Hello from Closure 2"

}
   
// Khai báo biến myVar3, với kiểu dữ liệu, và gán giá trị.

var myVar3 : (Int, Int) -> (Int)  =  { (a : Int, b: Int) -> (Int) in
   
   var c : Int =  a + b
   
   return c
}
   

func test_closure()     {
   
   // Thực thi khối lệnh
   myVar1()
   
   // Thực thi khối lệnh và nhận giá trị trả về.
   var str2 = myVar2()
   
   print(str2)
   
   // Thực thi khối lệnh, truyền vào tham số
   // và nhận giá trị trả về.
   var c: Int =  myVar3(11, 22)
   
   print(c)
   
}
Closure chính là các khối lệnh, có thể có tham số, và thể có kiểu trả về:

Cú pháp của Closure:

{  (parameters) -> returntype in
     // statements
}

2- Function so với Closure

Function chính là một trường hợp đặc biệt của Closure. Function chính là một Closure có tên hoặc có thể nói Closure chính là một Function nặc danh.
 

Về định nghĩa:

Về cách sử dụng:

3- Khai báo Closure nặc danh

Khi khai báo Closure bạn có thể không cần viết tên của các tham số, các tham số có thể tham chiếu thông qua $0, $1,...
AnonymousClosure.swift
import Foundation


// Khai báo một Closure theo cách thông thường.

var myClosure : (String, String) -> String
   
   = { (firstName: String, lastName: String) -> String in
   
   
   return firstName + " " + lastName
}


// Khai báo theo cách nặc danh
// (Bỏ qua danh sách tham số trong Closure)

var anonymousClosure : (String, String) -> String
   
   = {
     // Sử dụng
     // $0: Để tham chiếu vào tham số thứ nhất.
     // $1 : Để tham chiếu vào tham số thứ 2.
       
     return $0 + " " + $1
}
Chú ý: $0, $1,... là các tham số nặc danh, chúng chỉ được sử dụng trong các Closure nặc danh, nếu sử dụng trong các Closure thông thường bạn sẽ nhận được một thông báo lỗi.
Anonymous closure arguments cannot be used inside a closure that has explicit arguments
Ví dụ với Closure năc danh (2):
AnonymosClosure2.swift
import Foundation



func test_anonymousClosure()  {
 
   // Khai báo một biến kiểu Clouse.
   var mySum : ( Int, Int ) -> (Int)
 
 
   // Gán Closure nặc danh
   // (Closure nặc danh: Không cần chỉ rõ các tham số).
   // $0 : Ám chỉ tham số đầu tiên của Closure
   // $1 : Ám chỉ tham số thứ hai của Closure
   mySum =  {
       return $0 + $1
   }
 
 
 
   var value = mySum(1, 2)
 
   print(value)
 
}

4- Ngầm định giá trị trả về

Nếu trong nội dung của Closure có duy nhất một biểu thức, bạn có thể bỏ qua từ khóa return.
ImplicitReturnValues.swift
import Foundation


// Đây là một Clousure mà nội dung của nó chỉ có một biểu thức.

var closureWithReturn  =  { (a: Int, b: Int) -> Int in
 
   // Một biểu thức duy nhất.
   return a + b

}


// Có thể bỏ qua từ khoá return.

var closureWithoutReturn =  { (a: Int, b: Int) -> Int in
 
   // Nếu chỉ có một biểu thức duy nhất.
   // (Bỏ qua từ khoá return).
   a + b
 
}

5- Closure sử dụng trong hàm

  • TODO