Tìm hiểu Swift Either enum
Enum trong Swift rất mạnh mẽ và đa năng. Swift enum là 1 type với nguyên tắc riêng, có hỗ trợ cả methods và initializers, và tính năng liên kết các giá trị (Associated Value) cho phép chúng ta sử dụng 1 cách tiện lợi. Ví dụ về sức mạnh của enum là Optional type. Optional được xác ...
Enum trong Swift rất mạnh mẽ và đa năng. Swift enum là 1 type với nguyên tắc riêng, có hỗ trợ cả methods và initializers, và tính năng liên kết các giá trị (Associated Value) cho phép chúng ta sử dụng 1 cách tiện lợi.
Ví dụ về sức mạnh của enum là Optional type. Optional được xác định như 1 enum với 2 cases. Case None thể hiện sự vắng mặt của giá trị (nil), trong khi case Some bọc (cơ chế wrapping) biến có sự hiện cho giá trị liên quan của nó.
Một type mạnh mẽ nhưng ít được biết đến, mà chúng ta có thể triển khai thực hiện như 1 enum là Either.
Either
Type Either đại diện tính hai mặt, 1 giá trị có thể là 1 type hoặc khác
1 2 3 4 5 6 |
enum Either<A, B>{ case Left(A) case Right(B) } |
Either cho phép chúng ta viết được những khai báo rõ ràng, bản thân chúng đã là những comment giải thích cho chính chúng:
1 2 3 4 5 6 7 8 9 10 |
let x: Either<SomeType, AnotherType> = ... switch x { case .Left(let someTypeValue): // do something with someTypeValue case .Right(let anotherTypeValue): // do something with anotherTypeValue } |
Như vậy, Either có thể không thực tế lắm nhưng sau đây là vì dụ về cách sử dụng Either tốt: thêm các cell phụ trong 1 Table View hoặc Collection View.
Thêm các cell trong Table View đang sử dụng Either
Thỉnh thoảng, chúng ta cần thể hiện dữ liệu trong Table hoặc Collection Views với các cell phụ chuyên dụng để gọi 1 hành động hoặc các banner quảng cáo – cho phép người dùng loại bỏ những thứ này trong in-app purchase.
Chúng ta có thể thực hiện điều này bằng cách hiển thị 1 banner thay vì 1 item thực cho 1 index path cho trước và chuyển index đã sử dụng để lấy item tiếp theo mà chúng ta muốn hiển thị từ mảng dữ liệu, dựa trên số lượng các cells banner đã được hiển thị.
Hoặc chúng ta có thể sử dụng Either.
Bên cạnh các mảng cell models, các dev có thể cung cấp cho nguồn dữ liệu 1 mảng của Either<CellModel, BannerModel>.
1 2 3 4 5 6 7 |
let data: Either<CellModel, BannerModel> = ... func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return data.count } |
Nhờ đó, trong method tableView(_:cellForRowAt:) chúng ta có thể lấy item cho đoạn index hiện tại, chuyển và hành động phù hợp với type của nó như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let item = data[indexPath.row] let identifier: String = { switch item { case .Left: return pizzaCellIdentifier case .Right: return adCellIdentifier } }() let cell = tableView.dequeueReusableCell(withIdentifier: identifier, for: indexPath) switch item { case .Left(let pizza): configure(cell, with: pizza) case .Right(let ad): configure(cell, with: ad) } return cell } |
Bước tiếp cận này dường như thống nhất hơn với tôi. Nó không phụ thuộc vào bât kì thuật toán nào, hỗ trợ việc tiếp nhận code dễ dàng hơn, và tôi nhận thấy việc xây dựng switch-case là cách tự giải thích logic rất tốt cho source code của mình.
Các dev có thể xem full code trong Github
Techtalk via IDE Academy via Mokacoding