Swift 的 extension(扩展) 是一种强大的功能,允许在不修改原有类、结构体、枚举或协议代码的情况下,为它们添加新功能。以下是关于 Swift extension 的全面介绍和常见用法。
什么是 Swift Extension?
extension 可以扩展:
功能:添加新的方法、属性(仅计算属性)、初始化方法。
协议适配:使已有类型符合某个协议。
嵌套类型:为类型定义新的嵌套类型。
基础语法
extension ExistingType {
// 添加的新方法、属性或功能
}
常见用途
1、添加方法
为现有类型添加新方法:
extension String {
func reversedString() -> String {
return String(self.reversed())
}
}
let original = "Hello"
print(original.reversedString()) // 输出 "olleH"
2、添加计算属性
只能添加计算属性,不能直接存储属性:
extension Int {
var isEven: Bool {
return self % 2 == 0
}
var squared: Int {
return self * self
}
}
print(4.isEven) // true
print(3.squared) // 9
3、扩展初始化方法
可以为类型添加便利构造器(不允许添加指定构造器到类中)。
extension UIColor {
convenience init(red: Int, green: Int, blue: Int) {
self.init(
red: CGFloat(red) / 255.0,
green: CGFloat(green) / 255.0,
blue: CGFloat(blue) / 255.0,
alpha: 1.0
)
}
}
let customColor = UIColor(red: 34, green: 139, blue: 34)
4、协议适配
使类型符合某个协议:
protocol Greetable {
func greet()
}
extension String: Greetable {
func greet() {
print("Hello, \(self)!")
}
}
"Swift".greet() // 输出 "Hello, Swift!"
5、嵌套类型
在扩展中定义新的嵌套类型:
extension Int {
enum Parity {
case even, odd
}
var parity: Parity {
return self % 2 == 0 ? .even : .odd
}
}
print(3.parity) // 输出 odd
6、添加默认实现
为协议提供默认实现:
protocol Describable {
func describe()
}
extension Describable {
func describe() {
print("This is a Describable object.")
}
}
struct MyStruct: Describable {}
MyStruct().describe() // 输出 "This is a Describable object."
使用限制
1、不能添加存储属性:扩展中只能添加计算属性,不能直接存储数据。
2、不能重写原有功能:扩展中无法覆盖已有类或结构体的方法、属性或下标。
3、类中的指定构造器(Designated Initializers)不能通过扩展实现。
实用案例
1、为数组添加工具方法
extension Array where Element: Comparable {
func minAndMax() -> (min: Element, max: Element)? {
guard let min = self.min(), let max = self.max() else { return nil }
return (min, max)
}
}
let numbers = [1, 2, 3, 4, 5]
if let result = numbers.minAndMax() {
print("Min: \(result.min), Max: \(result.max)") // Min: 1, Max: 5
}
2、格式化日期
extension Date {
func formatted(_ format: String = "yyyy-MM-dd HH:mm:ss") -> String {
let formatter = DateFormatter()
formatter.dateFormat = format
return formatter.string(from: self)
}
}
let now = Date()
print(now.formatted()) // 2024-11-30 14:00:00
3、链式操作
extension String {
func trimmed() -> String {
return self.trimmingCharacters(in: .whitespacesAndNewlines)
}
func uppercasedFirst() -> String {
guard let first = self.first else { return self }
return first.uppercased() + self.dropFirst()
}
}
let input = " hello world "
print(input.trimmed().uppercasedFirst()) // 输出 "Hello world"
总结
Swift 的 extension 是增强代码可复用性和组织性的重要工具,特别适合以下场景:
1、为系统类型或第三方类型添加功能。
2、遵循协议,添加默认实现。
3、编写与类型相关的实用方法或计算属性。
扩展遵循开闭原则(对扩展开放,对修改封闭),能够更优雅地组织代码。