Closures trong lập trình swift
Closure Expressions – Biểu thức Closure
Biểu thức Closure – sử dụng để viết ngắn gọn trực tiếp, tập trung vào cú pháp mà không mất sự rõ ràng hay mục đích sử dụng. Các ví dụ biểu closure dưới đây minh hoạ những tối ưu hóa bằng cách chỉnh lại một ví dụ duy nhất của hàm được sắp xếp trên một số lần lặp, ví dụ thể hiện chức năng tương tự trong một cách gọn gàng hơn.
Cú pháp Closures chung
1
2
3
| { (<code>parameters</code>) -> <code> return type</code> in <code>statements</code> } |
– Cú pháp biểu thức
– Ví dụ: sắp xếp một mảng các giá trị String theo thứ tự từ Z – A (giảm dần)
closure
có thể sử dụng các tham số hằng hoặc biến. Tuples có thể được sử dụng như là các kiểu tham số và các kiểu trả về.– Ví dụ: sắp xếp một mảng các giá trị String theo thứ tự từ Z – A (giảm dần)
1
2
3
4
5
6
| let names = [ "Chris" , "Alex" , "Ewa" , "Barry" , "Daniella" ] func backwards(s1: String, s2: String) -> Bool { return s1 > s2 } var reversed = sorted(names, backwards) // Kết quả reversed = ["Ewa", "Daniella", "Chris", "Barry", "Alex"] |
+ Trong Swift cung cấp cho chúng ta hàm toàn cục để sắp xếp đó là
Hàm này nhận hai đối số:
sorted
Hàm này nhận hai đối số:
- Một mảng các với gị với một kiểu đã biết (
names
) - Một closure mà nhận hai đối số với một kiểu tương tự như là nội dung của mảng, và trả về một giá trị
Bool
để biết giá trị đầu tiên sẽ xuất hiện trước hoặc sau.(String, String) -> Bool
.
+ Nếu chuỗi đầu tiên (s1) lớn hơn chuỗi thứ hai (s2), hàm backwards sẽ trả về true, chứng tỏ rằng s1 sẽ xuất hiện trước s2 trong mảng được sắp xếp. Đối với các ký tự trong chuỗi, “lớn hơn” có nghĩa là “xuất hiện muộn hơn trong bảng chữ cái”.
+ Với ví dụ trên mình
+ Với ví dụ trên mình
return s1 > s2
sẽ sắp xếp mảng String từ Z-A,nếu đảo ngược lại return s1 < s2
chúng ta sẽ có mảng reversed
sắp xếp từ A-ZCác cách khai báo closure khác
– Cúng với ví dụ trên chúng ta hoàn toàn có thể viết dưới dạng sau:
1
2
3
| var reversed = sorted(names, { (s1: String, s2: String) -> Bool in return s1 > s2 }) |
– Hoặc cũng có thể viết trên cùng 1 dòng như sau:
1
| var reversed = sorted(names, { (s1: String, s2: String) -> Bool in return s1 > s2 } ) |
– Hoặc bạn hoàn toàn có thể viết closure dưới dạng rút gọn như sau:
1
| var reversed = sorted(names, { s1, s2 in s1 > s2 } ) |
+ Với cách viết rút gọn này thì trình biên dịch vẫn sẽ ngầm hiểu kiểu giá trị cũng như giá trị trả về từ biểu thức closure,nhưng các bạn lên khai báo kiểu dữ liệu cũng như kiểu giá tị trả về như vậy sẽ làm cho code của chúng ta rõ dàng hơn.
– Shorthand Argument Names – Tên đối số ngắn gọn
– Shorthand Argument Names – Tên đối số ngắn gọn
1
| reversed = sorted(names, { $0 > $1 } ) |
+ Ở đây,
– Hàm toán tử (Operator Functions)
$0
và $1
tham chiếu tới đối số String thứ nhất và thứ hai của closure.– Hàm toán tử (Operator Functions)
1
| reversed = sorted(names, > ) |
+ Đây là cách viết ngắn gon nhất
Trailing Closures
– Ví dụ: c huyển đổi một mảng với giá trị Int thành một mảng với giá trị String
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| //khai báo từ điển let digitNames = [ 0: "Zero" , 1: "One" , 2: "Two" , 3: "Three" , 4: "Four" , 5: "Five" , 6: "Six" , 7: "Seven" , 8: "Eight" , 9: "Nine" ] //khai báo mảng số nguyên let numbers = [16, 58, 510] let strings = numbers.map { ( var number) -> String in var output = "" while number > 0 { output = digitNames[number % 10]! + output number /= 10 } return output } // strings is inferred to be of type [String] // its value is ["OneSix", "FiveEight", “FiveOneZero"] |
+ Ví dụ trên sử dụng mảng các số để tạo ra một mảng các giá trị String, bằng cách truyền một biểu thức closure vào phương thức
+ Việc gọi subscript của từ điển
+
+ Quá trình này được lặp lại cho tới khi
map
của mảng như là một trailing closure. Lưu ý rằng việc gọi numbers.map
không cần phải bao gồm bất kỳ dấu ngoặc đơn sau map, bởi vì phương thức map
chỉ có duy nhất một tham số và tham số đó được cung cấp như là một trailing closure+ Việc gọi subscript của từ điển
digitNames
có kèm theo bởi một dấu chấm than (!), bởi vì subscript từ điển trả về một giá trị optional để chỉ ra rằng việc tra cứu trừ điển có thể không tìm thấy nếu từ khoá không tồn tại+
number % 10
sẽ trả về cho ta số dữ (giá trị là 6 cho 16, 8 cho 58, 0 cho 510)+ Quá trình này được lặp lại cho tới khi
number /= 10
cho kết quả là 0
, lúc này chuỗi output
được trả về bởi closure, và được thêm vào mảng đầu ra bởi hàm map
.
Bạn muốn học lập trình hãy liên hệ ngay với Mỹ Vân để được nhận ưu đãi từ học viện nhé
Không có nhận xét nào:
Đăng nhận xét