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