Block simple with swift!.
Bài đăng này đã không được cập nhật trong 6 năm
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.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