Category 和 Extension 的区别

category

swift 复制代码
@interface ClassName (CategoryName)
 
@end

extension 又被称为匿名分类(anonymous category)

swift 复制代码
@interface ClassName ()
 
@end

可以在 extension 的{}中添加自定义的实例变量

swift 复制代码
@interface XYZPerson () {
    id _someCustomInstanceVariable;
}
...
@end

主要区别

  • Category是运行时 决定生效的,Extension是编译时就决定生效的
  • Category可以为系统类添加分类,Extension不能。
  • Category是有声明和实现,Extension直接写在宿主.m文件,只有声明。
  • Category只能扩充方法,不能扩充成员变量和属性。
  • 如果Category声明了一个属性,那么Category只会生成这个属性的set,get方法的声明,也就不是会实现 get set 方法。属性的实例变量无法被存储,除非是原有类的实例变量。
  • 如果我们在 extension 中添加了方法, 那么这些方法必须在类的实现中实现。

参考:https://juejin.cn/post/6960972413240606734

swift 不能在 extension 中添加存储属性,但可以通过 AssociatedKey 的方式来间接实现。

swift 复制代码
public extension UIView {
    private struct AssociatedKey {
        static var identifier: String = "identifier"
    }
    
    public var identifier: String {
        get {
            return objc_getAssociatedObject(self, &AssociatedKey.identifier) as? String ?? ""
        }
        
        set {
            objc_setAssociatedObject(self, &AssociatedKey.identifier, newValue, .OBJC_ASSOCIATION_COPY_NONATOMIC)
        }
    }
}

参考:https://juejin.cn/post/6856416734577410055

swift 的 extension 相当于影分身,每个分身可以具有不同技能(遵循了某个协议或数据源或新定义一下方法)

swift 的 category 写法:extension name on SomeClass

swift 复制代码
extension SomeName on DateTime {
  
}
相关推荐
坏小虎32 分钟前
Expo 快速创建 Android/iOS 应用开发指南
android·ios·rn·expo
光影少年2 小时前
Android和iOS原生开发的基础知识对RN开发的重要性,RN打包发布时原生端需要做哪些配置?
android·前端·react native·react.js·ios
北京自在科技2 小时前
Find My 修复定位 BUG,AirTag 安全再升级
ios·findmy·airtag
Digitally3 小时前
如何不用 USB 线将 iPhone 照片传到电脑?
ios·电脑·iphone
Sim148015 小时前
iPhone将内置本地大模型,手机端AI实现0 token成本时代来临?
人工智能·ios·智能手机·iphone
Digitally17 小时前
如何将 iPad 上的照片传输到 U 盘(4 种解决方案)
ios·ipad
报错小能手19 小时前
ios开发方向——swift并发进阶核心 @MainActor 与 DispatchQueue.main 解析
开发语言·ios·swift
LcGero19 小时前
Cocos Creator 业务与原生通信详解
android·ios·cocos creator·游戏开发·jsb
ii_best20 小时前
lua语言开发脚本基础、mql命令库开发、安卓/ios基础开发教程,按键精灵新手工具
android·ios·自动化·编辑器
用户223586218202 天前
WebKit WebPage API 的引入尝试与自研实现
ios