/ / Lập trình ios / Comment (0)

Closures trong lập trình swift

Trong bài học trước mình đã giới thiệu cho các bạn về khái niệm cũng như cách sử dụng hàm trong Swift,trong bài hôm nay mình sẽ giới thiệu cho các bạn khái niệm mới đó là Closures.Ở bài trước chúng ta đã tìm hiểu tới hàm lồng nhau và đó được coi như một trường hợp đặc biệt của Closures .Closures trong lập trình swift tương tự như blocks trong C và Object-C.

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

{ (<code>parameters</code>) -> <code>return type</code> in
    <code>statements</code>
}

– Cú pháp biểu thức 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)

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à sorted
Hàm này nhận hai đối số:

  1. Một mảng các với gị với một kiểu đã biết (names)
  2. 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 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-Z

Cá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:

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:

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:

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

reversed = sorted(names, { $0 > $1 } )

+ Ở đây, $0 $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)

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

//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 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.



06/07/2015
Tags:
Written by nobitacnt

Trong bài viết không tránh khỏi những câu từ chưa chính xác,mong nhận được sự góp ý để website hoàn thiện hơn.Nếu thấy bài viết có ích với bạn hãy like và share để ủng hộ nhé :D.

Bài viết chùng chuyên mục

Gửi bình luận

Giới thiệu

Mình tạo ra blog này với mong muốn chia sẻ và học hỏi kinh nghiệm trong quá trình thiết kế website. Website đang trong quá trình phát triển chân thành cảm ơn mọi sự góp ý của các bạn để làm cho website ngày càng hoàn thiên.

DMCA.com Protection Status
Theo dõi qua Email

Tổng hợp các bài viết về

Hoc php - CodeIgniter Framework - Laravel Framework - PHP va MYSQL