Swift 扩展


Swift 扩展(Extension)

Swift 中的扩展是一种非常强大且有用的功能,它允许我们在已有的类、结构体、枚举等类型上添加新的功能或修改现有功能。通过简单的语法,我们可以在不改变原始类型的情况下增加新的方法、计算属性、下标脚本等等。

扩展的语法

在 Swift 中,扩展的基本语法如下:

extension SomeType {
    // 新的功能
}
  • SomeType:指被扩展的类型,可以是类、结构体、枚举等。
  • 大括号内是新增的功能,包括方法、计算属性、下标脚本等。

扩展中的方法

在扩展中我们可以添加新的实例方法或类型方法:

extension Int {
    func isOdd() -> Bool {
        return self % 2 == 1
    }
    
    static var zero: Int {
        return 0
    }
}
  • isOdd():用于判断一整数是否为奇数。
  • zero:用于返回整数类型变量的初始值0。

在上述示例中,我们为整数类型 Int 添加了一个新的实例方法 isOdd(),以及一个新的类型方法 zero。这些方法可以被任意 Int 类型的变量或常量调用。

扩展中的计算属性

我们可以在扩展中添加新的计算属性,也可以通过扩展重写现有的计算属性。示例代码:

extension Double {
    var km: Double {
        return self * 1_000.0
    }
    
    var currency: String {
        let formatter = NumberFormatter()
        formatter.numberStyle = .currency
        return formatter.string(from: NSNumber(value: self)) ?? ""
    }
}

let distance = 1.0
let distanceInKm = distance.km
print(distanceInKm) // 输出:1000.0

let money = 1234.5
let currencyText = money.currency
print(currencyText) // 输出:$1,234.50

在上述示例中,我们为 Double 类型添加了 km 计算属性,用于将距离从米转换为千米。同时为 Double 类型添加了 currency 计算属性,用于将数字转化为货币格式的字符串。

扩展中的下标脚本

我们可以在扩展中添加新的下标脚本。示例代码:

extension String {
    subscript(index: Int) -> Character? {
        guard index >= 0 && index < self.count else {
            return nil
        }
        return self[self.index(self.startIndex, offsetBy: index)]
    }
}

let str = "Hello, World!"
print(str[1]) // 输出:e

在上述示例中,我们为 String 类型添加了一个整数下标脚本,用于访问字符串中特定的字符。

扩展中的协议实现

我们可以利用扩展来为协议中的方法、计算属性提供默认的实现。以下示例展示了为 CustomStringConvertible 协议提供默认实现:

extension CustomStringConvertible {
    var description: String {
        return "(\(Self.self))"
    }
}

struct Person: CustomStringConvertible {
    let name: String
    let age: Int
    
    var description: String {
        return "\(name) (\(age))"
    }
}

let person = Person(name: "Tom", age: 18)
print(person) // 输出:Tom (18)
print(String(describing: person)) // 输出:(Person)

在上述示例中,我们为 CustomStringConvertible 协议添加了一个默认的实现,实现了 description 计算属性。然后,我们创建了一个实现了该协议的人员类(Person),并重写了 description 方法,最终在程序中输出。

总结

扩展是 Swift 中一个非常有用且强大的特性,它可以为我们带来更加灵活的编程体验。通过使用扩展,我们可以为已有的类型添加新的方法、计算属性、下标脚本等。同时,扩展还提供了一种为协议添加默认实现的方式,让我们的代码更加简单易于维护。