OC Category vs Swift Extension 核心对比

9 阅读1分钟

一、核心区别

维度OC CategorySwift Extension
支持类型仅类类、结构体、枚举、协议
命名要求必须有分类名无需命名,自动合并
添加属性❌(需关联对象模拟)✅ 仅计算属性
协议扩展✅ 可添加默认实现
初始化方法✅ 支持添加
泛型支持✅ 条件扩展
方法覆盖✅(风险高)❌(编译报错)
文件组织需拆分为 .h/.m可写在任意位置

二、关键差异示例

1. 类型支持范围

// OC: 只能扩展类
@interface UIView (Layout)
- (void)setCornerRadius:(CGFloat)radius;
@end
// Swift: 可扩展所有类型
extension String {
    func toInt() -> Int? { Int(self) }
}

extension Optional where Wrapped == String {
    var isEmptyOrNil: Bool { self?.isEmpty ?? true }
}

2. 协议扩展(Swift独有)

protocol Printable {
    func printContent()
}

extension Printable {
    func printContent() { print("默认内容") } // 默认实现
}

class MyClass: Printable {} // 自动获得实现
MyClass().printContent() // "默认内容"

3. 初始化方法

// Swift支持
extension UIButton {
    convenience init(title: String, color: UIColor) {
        self.init(type: .system)
        self.setTitle(title, for: .normal)
        self.setTitleColor(color, for: .normal)
    }
}
// OC不支持
// @implementation UIButton (CustomInit) ❌ 不能添加初始化方法

三、选择建议

使用 OC Category 当:

  • 扩展OC类(尤其第三方库)
  • 需要关联对象存储数据
  • 混合开发中的OC部分

使用 Swift Extension 当:

  • 扩展Swift所有类型
  • 需要协议默认实现
  • 添加便捷初始化方法
  • 进行泛型条件扩展

四、总结

OC Category是类专用的扩展工具,能力有限但有运行时灵活性。
Swift Extension是全类型通用扩展工具,更安全、强大,支持现代Swift特性。

二者是不同语言的独立概念,仅在"扩展已有类型"这一功能上有重叠。