Parameter closure: Code to execute after delay */

Một phần của tài liệu Lập trình SWIFT cho IOS (Trang 43 - 46)

Tạo các chức năng trợ giúp toàn cần

Các biến và chức năng toàn cầu thường được coi như “một điều tồi tệ”, tuy nhiên trong thực tế thì cả hai đều có thể giúp chúng ta tạo ra những dòng code gọn gàng nhất. Điều tồi tệ thực sự có lẽ phải là Global State (câu lệnh toàn cầu). Các chức năng toàn cầu thường cần những câu lệnh toàn cầu để có thể hoạt động, vì thế bạn có thể dễ dàng nhận ra tại sao chúng lại được coi là tồi tệ. Sau đây là một số ví dụ của chức năng trợ giúp Grand Central Dispatch mà không hoạt động trong câu lệnh toàn cầu, nhiều hay ít các cú pháp dễ dàng. Sau đây, chúng ta sẽ thêm chức năng dispatch_after và đưa nó về theo dạng của Swift

12 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import Foundation /**

Executes the closure on the main queue after a set amount of seconds.

- parameter delay: Delay in seconds

- parameter closure: Code to execute after delay*/ */

func delayOnMainQueue(delay: Double, closure: ()->()) {

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC))), dispatch_get_main_queue(), closure }

/**

Executes the closure on a background queue after a set amount of seconds.

- parameter delay: Delay in seconds

- parameter closure: Code to execute after delay*/ */

func delayOnBackgroundQueue(delay: Double, closure: ()->()) {

21 }

Sau đây là một ví dụ cho bạn dễ hình dung một chức năng Wrapper mới có cấu trúc ra sao:

12 2 3 delayOnBackgroundQueue(5) { showView() }

Và ví dụ một chức năng Unwrapped trông thế nào:

12 2 3

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC))), dispatch_get_global_queue(QOS_CLASS_UTILITY showView()

}

Wrapping các chức năng ngôn ngữ C với các cú pháp Swift có thể khiến những đoạn code của chúng ta dễ hiểu hơn. Hãy tìm hiểu những chức năng mà bạn yêu thích và triển khai ngay và luôn. Sự duy trì những chức năng đó trong tương lai sẽ khá là hay miễn là chúng ta vẫn giữ được trách nhiệm với việc đặt tên chính xác cho các phương thức. Nếu chúng ta thay đổi chữ ký phương thức ở trên thành delay(delay: Double, closure:()->()), nó có thể là một ví dụ của một tên phương thức không có trách nhiệm gì bởi vì dispatch_after đòi hỏi một tiến trình GCD, và cái tên đó sẽ không đem lại cho chúng ta bất kì một dấu hiệu nào của tiến trình ta đang sử dụng. Tuy nhiên, nếu như đoạn code đó đang hoạt động trong một quy ước đã được thiết lập sẵn trong việc tính toán tất cả các phương thức trong các chủ đề chính nếu không được nhân biết trong tên hay các comments, delay(delay: Double, closure: () -> ()) sẽ là một tên phương thức chính xác. Bất kể ta đặt tên gì cho các chứng năng trợ giúp thì mục đích của nó vẫn là tiết kiệm thời gian cho chúng ta bằng cách wrapping các đoạn code mẫu và khiến chúng dễ đọc hơn.

BÀI 16. NHỮNG THỦ THUẬT CẦN BIẾT TRONG LẬP TRÌNH SWIFT (PHẦN CUỐI)

Mở rộng khả năng thu thập

Swift có thể thêm một số phương thức giúp chúng ta quản lý và chỉnh sửa các bộ sưu tập tạm thời. Những phương thức sưu tập này chịu ảnh hưởng từ các ngôn ngữ chức năng. CHúng ta sử dụng những bộ sưu tập này để lưu trữ rất nhều giá trị vào trong một cấu trúc dữ liệu đơn lẻ và thường xuyên khi chúng ta quản lý và chỉnh sửa chúng. Những chức năng này được xây dựng trong thư viện mở của Swift và giúp chúng ta làm đơn giản hóa những tác vụ thông thường. Để có thể giải thích rõ hơn những chức năng sau, chúng tôi sẽ sử dụng ví dụ sau: let ints = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].

• Map sẽ đóng từng giá trị một trong bộ sưu tập, sau đó quay trở lại một mảng của map, kết quả được điền với các giá trị trong map. Sau đây chúng tôi sẽ chuyển dổi mảng Int sang mảng String:

12 2

let strings = ints.map { return String($0) }

print("strings: \(strings)") // prints: strings: ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]

• Filter sẽ thiết đặt 1 chức năng tới từng giá trị trong mang của chúng ta và return giá trị Bool. Những giá trị được quy về “true” đã được quy lại về kết quả của mảng trong khi đó các giá trị được quy về “false” thì ngược lại. Sauđây chúng tôi sẽ lọc các số lẻ từ mảng ints:

12 2

let evenInts = ints.filter { return ($0 % 2 == 0) }

print("evenInts: \(evenInts)") // prints: evenInts: [0, 2, 4, 6, 8]

• reduce lại có phần phức tạp hơn so với map và filter, tuy nhiên hiệu quả của nó thì không thể phủ nhận, rất có ích trong việc học curve. Đối số thứ nhất chính là giá trị được lược bỏ đầu tiên (ở trường hợp sau là 0). Đối số thứ 2 là một chức năng có quyền truy cập vào giá trị đã được lược bỏ trước đó và giá trị hiện tại của mảng. Trong ví dụ sau,chức năng is + của chúng tôi sẽ thêm vào những giá trị trước của giá trị hiện tại trong mảng 1 cách dễ dàng.

12 2 3 4 5 6 7 8 9

let reducedInts = ints.reduce(0, combine: +)

print("reducedInts: \(reducedInts)") // prints: reducedInts: 45

// defined another way:

let reducedIntsAlt = ints.reduce(0) { (previousValue: Int, currentValue: Int) -> Int in return previousValue + currentValue

}

print("reducedIntsAlt: \(reducedIntsAlt)") // prints: reducedIntsAlt: 45

Cùng với các thủ thuật về map, filter và reduce, chúng ta hoàn toàn có thể giảm thiểu tối đa công sức phải bỏ ra để lọc và hoạt động các bộ sưu tập trung khi đó nó còn giúp tăng khả năng đọc và chỉnh sửa cho các lập trình viên sử dụng code sau này.

Một phần của tài liệu Lập trình SWIFT cho IOS (Trang 43 - 46)

Tải bản đầy đủ (DOCX)

(46 trang)
w