0

Block simple with swift!.

Trước hết mình sẽ code phần base như sau:

public protocol Block {}

extension Block where Self: Any {
    
    /// Structures and Enumerations **Are Value Types**
    public func with(_ block: (inout Self) throws -> Void) rethrows -> Self {
        var copy = self
        try block(&copy)
        return copy
    }
    
    /// To do Something
    public func `do`(_ block: (inout Self) throws -> Void) rethrows {
        var copy = self
        try block(&copy)
    }
}

/// sử dụng then với điều kiện đây là class (where Self: AnyObject)
extension Block where Self: AnyObject {
    /// Classes Are Reference Types
    public func then(_ block: (Self) throws -> Void) rethrows -> Self {
        try block(self)
        return self
    }
}

  • sử dụng with đối với Are Value Types Ví dụ:
let frame = CGSize().with {
    $0.width = 10
    $0.height = 10
}
/// sử dụng with bởi vì đây là là Struct.
/// kết quả trên giống với kết quả sau đây
let frameSize = CGSize(width: 10, height: 10)

/// chúng ta copy đối tượng cũ, sửa đổi property và tạo ra đối tượng mới.
let newFrame = frame.with {
    $0.width = 100
    $0.height = 100
}
  • sử dụng then đối với Are Reference Types Ví dụ:
let titleTable = UILabel().then { (label) in
    label.textAlignment = .center
    label.textColor = .black
    label.text = "Hello World!"
}
/// sử dụng then bởi vì đây là Class
/// kết quả ở trên giống kết quả ở đây
let label: UILabel = {
    let label = UILabel()
    label.textAlignment = .center
    label.textColor = .black
    label.text = "Hello World!"
    return label
}()
  • sử dụng do để "Todo something" Ví dụ:
UserDefaults.standard.do {
    $0.set("Chicken", forKey: "username")
    $0.set("chicken@gmail.com", forKey: "email")
    $0.synchronize()
}
/// sử dụng theo cách thông thường
UserDefaults.standard.set("Chicken", forKey: "username")
UserDefaults.standard.set("Chicken@gmail.com", forKey: "email")
UserDefaults.standard.synchronize()

Bonus

  • Theo cách thông thường:
final class ViewController: UIViewController {
    
    let titleLabel: UILabel = {
        let lable = UILabel()
        lable.textColor = .black
        lable.textAlignment = .center
        return lable
    }()
    
    let tableView: UITableView = {
        let tableView = UITableView()
        tableView.backgroundView = .clear
        tableView.separatorColor = .none
        tableView.register(MyCell.self, forCellReuseIdentifier: "MyCell")
        return tableView
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(titleLabel)
        view.addSubview(tableView)
    }
}

  • theo cách sử dụng closure, gọn gàng, dễ hiểu và đẹp hơn rất nhiều.
final class ViewController: UIViewController {
    
    let titleLabel = UILabel().then {
        $0.textColor = .black
        $0.textAlignment = .center
    }
    
    let tableView = UITableView().then {
        $0.backgroundColor = .clear
        $0.separatorStyle = .none
        $0.register(MyCell.self, forCellReuseIdentifier: "myCell")
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(titleLabel)
        view.addSubview(tableView)
    }
}

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí