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.03. 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) // 164. 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: 426. Extension với where
extension Array where Element: Numeric {
var sum: Element {
reduce(0, +)
}
}
print([1, 2, 3, 4, 5].sum) // 157. 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) // negative8. 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
wherecho constrained extensions- Tổ chức code theo protocols
- Không thể thêm stored properties
Last updated on
Swift