Swift Extension扩展功能教程
Swift Extension扩展功能教程

Swift Extension扩展功能教程

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、编写与类型相关的实用方法或计算属性。

扩展遵循开闭原则(对扩展开放,对修改封闭),能够更优雅地组织代码。

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注