一、核心区别
| 维度 | OC Category | Swift 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特性。
二者是不同语言的独立概念,仅在"扩展已有类型"这一功能上有重叠。