12/08/2018, 17:15
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 ...
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(©) return copy } /// To do Something public func `do`(_ block: (inout Self) throws -> Void) rethrows { var copy = self try block(©) } } /// 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.awidth = 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(awidth: 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.awidth = 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) } }