Hàm toàn cục hữu dụng trong Swift

zip():

Hàm zip cho phép chúng ta có thể merge 2 hay nhiều mảng vào một Sequence của một tuple. Zip rất hữu dụng chúng ta cần lặp 2 việc cùng lúc thì nếu không dùng zip chúng ta sẽ phải dùng For loop và truy cập mỗi index từ mỗi mảng, còn sử dụng zip cho phép chúng tatruy cập các element từ tất cả các mảng.
Ví dụ, nếu chúng ta có một form đăng kí người dùng và chúng ta muốn cập nhật textFields để render một danh sách kết quả validation nhận từ backend, thường chúng ta sẽ làm như này:

func present(validationResults: [FieldValidationResult],
             inTextFields textFields: [MyTextField]) {
    for i in 0..<textFields.count {
        let field = textFields[i]
        let result = validationResults[i]
        field.render(validationResult: result)
    }
}

Còn với zip thì

func present(validationResults: [FieldValidationResult],
             inTextFields textFields: [MyTextField]) {
    for (field, result) in zip(textFields, validationResults) {
        field.render(validationResult: result)
    }
}

dump():

Hàm dump dùng để in ra các đối tượng. Trong khi để in các đối tượng thì chúng ta dùng các syntax như description hay debugDescription, dump sẽ in nội dung của đối tượng sử dụng sự phản chiếu, cho kết quả đầu đủ hơn bao gồm cả các cấp của đối tượng đó

class Foo: NSObject {
    let bar: String = "bar"
}

let foo = Foo()
print(foo)
// <SwiftRocks.Foo: 0x1030b9250>

dump(foo)
// ▿ <SwiftRocks.Foo: 0x1030b9250> #0
//     - super: NSObject
//    - bar: "bar"

sequence()

Hàm sequence() để chúng ta viết hàm đệ quy trong một syntax đẹp hơn. Giả sử chúng ta thay đổi màu nền của một subvuew và tất cả view cha của nó, có lẽ chúng ta sẽ sử dụng while loop như thế này:

var currentView: UIView? = self
while currentView != nil {
    currentView?.backgroundColor = .green
    currentView = currentView?.superview
}

Trong trường hợp này thì cách sủ dụng hiệu quả nhất là dùng sequence(), như khía cạnh của phương thức (currentView = currentView?.superview) luôn như nhau, chúng ta có thể sử dụng sequence() vào một vòng for loop như sau:

for view in sequence(first: self, next: { $0.superview } ) {
    view.backgroundColor = .green
}

repeatElement() Với một đối tượng và con số được cho, kết quả là một Sequence có thể được lặp đối tượng đó với số lần được cho.

let repeated: Repeated<String> = repeatElement("SwiftRocks", count: 3)
for value in repeated {
    print(value)
}
//SwiftRocks
//SwiftRocks
//SwiftRocks

Hầu hết cá kiểu liệu đều có khởi tạo đặc biệt như sau:

let array = [Int](repeating: 0, count: 10)

Vậy tạo sao chúng ta sử dụng repeatElement? Lý do là vì hiệu suất. Kiểu trả về của repeatElement() là một kiểu Sequence Repeated<T>, nghĩa là nó không làm gì ngoài việc cung cấp chức năng lặp. Giả sử chúng ta muốn hay thế một phần cụ thể mảng số với một số khác, một cách để thực hiện được việc này là sử dụng replaceSubrange với mảng khác:

array.replaceSubrange(2...7, with: [Int](repeating: 1, count: 6))
print(array)
// [0, 0, 1, 1, 1, 1, 1, 1, 0, 0]

Việc sử dụng[Int](repeating:) kèm theo với nó là phải khởi tạo một mảng buffer ko làm gì. Nếu bạn chỉ cần chức năng lặp thì sử dụng repeatElement sẽ có hiệu suất tốt hơn.

array.replaceSubrange(2...7, with: repeatElement(1, count: 6))

stride():

stride() là hàm được thêm vào Swift như một cách tạo vòng lập for để có thể bỏ qua các element nhất định:

for (int i = 0; i < 10; i += 2) { ... }

Giờ chúng ta có thể sử dụng stride để đạt được mục đích như đoạn code trên:

for i in stride(from: 0, to: 10, by: 2) {
    // from 0 to 9, skipping odd numbers.
}

Đây là cách chúng ta có thể thêm khái niệm "những ngày khác biệt" vào đối tượng Date để chúng ta có thể sử dụng stride(): (trên thực tế thì Date() đã cài đặt phương thức Strideable)

extension Date: Strideable {
    func advanced(by n: Int) -> Date {
        return Calendar.current.date(byAdding: .day,
                                     value: n,
                                     to: self)!
    }

    func distance(to other: Date) -> Int {
        return Calendar.current.dateComponents([.day],
                                               from: other,
                                               to: self).day!
    }
}

let startDate = Date()
let finalDate = startDate.advanced(by: 5)

for date in stride(from: startDate, to: finalDate, by: 1) {
    print(date)
}
// March 24th
// March 25th
// March 26th
// March 27th
// March 28th

Những hàm toàn cục khác như:
max(): Trả về giá trị lớn nhất của đối số.
min(): Trả về giá trị nhỏ nhất của đối số.
abs(): Trả về giá trị tuyệt đối của đối số.

Reference: https://swiftrocks.com/useful-global-swift-functions


All Rights Reserved