Skip to Content

Extensions trong Swift

1. Giới thiệu

Extensions thêm functionality vào types có sẵn.

2. Thêm Computed Properties

extension Double { var km: Double { self * 1000.0 } var m: Double { self } var cm: Double { self / 100.0 } } let distance = 5.km print(distance) // 5000.0

3. Thêm Methods

extension Int { func squared() -> Int { return self * self } mutating func square() { self *= self } } print(5.squared()) // 25 var num = 4 num.square() print(num) // 16

4. Thêm Initializers

extension CGRect { init(center: CGPoint, size: CGSize) { let origin = CGPoint( x: center.x - size.width / 2, y: center.y - size.height / 2 ) self.init(origin: origin, size: size) } }

5. Conform to Protocol

protocol Describable { var description: String { get } } extension Int: Describable { var description: String { "Number: \(self)" } } print(42.description) // Number: 42

6. Extension với where

extension Array where Element: Numeric { var sum: Element { reduce(0, +) } } print([1, 2, 3, 4, 5].sum) // 15

7. Nested Types

extension Int { enum Kind { case negative, zero, positive } var kind: Kind { switch self { case 0: return .zero case let x where x > 0: return .positive default: return .negative } } } print(5.kind) // positive print((-3).kind) // negative

8. Extension cho Protocol

protocol Greetable { var name: String { get } } extension Greetable { func greet() { print("Hello, \(name)!") } } struct Person: Greetable { var name: String } Person(name: "Alice").greet() // Hello, Alice!

9. Tổ chức code với Extension

class ViewController: UIViewController { // Core functionality } // MARK: - UITableViewDataSource extension ViewController: UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 10 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { return UITableViewCell() } } // MARK: - UITableViewDelegate extension ViewController: UITableViewDelegate { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { // Handle selection } }

10. Giới hạn

// ❌ Không thể thêm stored properties // extension String { // var cached: String // Error! // } // ✅ Chỉ có thể thêm computed properties extension String { var reversed: String { String(self.reversed()) } }

📝 Tóm tắt

  • Extension thêm functionality
  • Computed properties, methods, initializers
  • Conform protocols qua extension
  • where cho constrained extensions
  • Tổ chức code theo protocols
  • Không thể thêm stored properties
Last updated on