oc分类和swift扩展有哪些区别

目录

  • 1. 语言环境
  • 2. 主要目的
  • 3. 核心能力对比
  • 4. 关键差异详解
    • 4.1. 属性支持
    • 4.2. Swift 扩展
    • 4.3. 初始化器
    • 4.4. 方法冲突与覆盖
    • 4.5. 关联类型与泛型
  • 5. 设计哲学
  • 6. 总结表

在 Objective-C 和 Swift 中,分类(Category)和扩展(Extension)都是为现有类添加新功能的方式,但它们在实现、能力和特性上有显著区别:


1. 语言环境

  • OC分类:用于Objective-C语言。
  • Swift扩展:用于Swift语言,用于 Swift 中的类、结构体、枚举或协议。

2. 主要目的

  • OC分类:主要目的是为已有的类添加方法(包括实例方法和类方法),也可以添加属性(但属性不会自动生成实例变量,需要借助关联对象)。
  • Swift扩展:可以添加新的计算属性、方法(实例方法和类方法)、构造器、下标、嵌套类型,还可以使已有类型遵循某个协议。

3. 核心能力对比

功能Objective-C 分类Swift 扩展
添加方法✅ 支持✅ 支持
添加计算属性❌ 不支持(需关联对象模拟)✅ 支持
添加存储属性❌ 不支持(需关联对象模拟)❌ 不支持
添加初始化器⚠️ 可为类添加新初始化器(需调用 self = [super init]✅ 可为结构体/枚举添加;类仅支持便利初始化器
添加嵌套类型❌ 不支持✅ 支持(嵌套类/结构体/枚举)
遵守协议✅ 支持✅ 支持
覆盖现有方法⚠️ 支持(但易冲突,不推荐)❌ 编译错误(不允许覆盖)

4. 关键差异详解

4.1. 属性支持

Objective-C 分类
不能直接添加存储属性。需用 @property + 关联对象objc_setAssociatedObject)模拟,但本质是全局字典而非真实属性。

// 分类中模拟“存储属性”
@property (nonatomic, strong) NSString *tempProperty;
- (void)setTempProperty:(NSString *)value {objc_setAssociatedObject(self, @"key", value, OBJC_ASSOCIATION_RETAIN);
}
- (NSString *)tempProperty {return objc_getAssociatedObject(self, @"key");
}

4.2. Swift 扩展

可直接添加计算属性,但不能添加存储属性或属性观察器(didSet/willSet)。

extension UIView {var screenSize: CGSize {  // ✅ 计算属性return UIScreen.main.bounds.size}// ❌ 以下会编译报错// var storedProperty: Int = 0// var observedProperty: Int { didSet { ... } }
}

4.3. 初始化器

Objective-C 分类
可为类添加新初始化器,但需手动调用 self = [super init],且可能破坏封装性。

@implementation NSString (MyCategory)
- (instancetype)initWithCustomFormat {self = [self initWithString:@"Custom"];return self;
}
@end

Swift 扩展

  • 值类型(结构体/枚举):可添加新初始化器(需确保所有存储属性初始化)。
  • 引用类型(类):只能添加便利初始化器convenience init),不能添加指定初始化器或析构器。
extension CGRect {// ✅ 值类型的初始化器init(center: CGPoint, size: CGSize) {self.init(origin: CGPoint(x: center.x - size.width/2, y: center.y - size.height/2), size: size)}
}class MyClass {}
extension MyClass {// ✅ 类的便利初始化器convenience init(custom: Int) {self.init()// 配置逻辑}// ❌ 报错:不能添加指定初始化器// init(custom: Int) { ... }
}

4.4. 方法冲突与覆盖

  • Objective-C 分类
    允许覆盖原类方法(编译通过),但多个分类覆盖同一方法时,行为由加载顺序决定(最后加载的分类生效),易引发难以调试的冲突。

Swift 扩展
严格禁止覆盖现有成员(编译错误),确保类型安全:

class MyClass {func print() { }
}
extension MyClass {func print() { } // ❌ 编译报错:Invalid redeclaration of 'print()'
}

4.5. 关联类型与泛型

Swift 扩展
可为协议添加默认实现,支持泛型约束:

extension Collection where Element: Equatable {func contains(_ element: Element) -> Bool { ... } // 为所有元素可判等的集合添加默认方法
}
  • Objective-C 分类
    无法支持泛型或协议扩展。

5. 设计哲学

  • Objective-C 分类
    基于运行时的动态特性,允许方法覆盖(风险高),依赖关联对象模拟属性,灵活性高但安全性低。
  • Swift 扩展
    编译时静态解析,禁止覆盖,强调类型安全,支持协议扩展和泛型,更适合构建健壮架构。

6. 总结表

特性Objective-C 分类Swift 扩展
作用对象仅 Objective-C 类类、结构体、枚举、协议
存储属性❌(需关联对象模拟)
计算属性
方法覆盖⚠️ 允许(有风险)❌ 编译禁止
协议默认实现
泛型支持✅(通过 **where**
子句)
安全性低(运行时冲突)高(编译时检查)

根据需求选择:

  • 需动态添加属性/覆盖方法 → Objective-C 分类(需谨慎)。
  • 需类型安全/添加计算逻辑/扩展协议 → Swift 扩展

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/88609.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/88609.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

go.work

一般学习一个小东西时,无非两点,1、怎么用? 2、为啥用?在写一个小的项目demo时,忽然看到一个奇怪的东西“go.work”?这是啥?好奇😯,想知道。我是这么问AI的:g…

Kimi K2万亿参数开源模型原理介绍

Kimi K2 技术全解:1T MoE 大模型如何炼成开放智能体 文章目录Kimi K2 技术全解:1T MoE 大模型如何炼成开放智能体1. 模型架构与特点:1 T MoE 的「大」与「省」2. 主要创新点:MuonClip、Agentic RL 与工具调用2.1 MuonClip 优化器&…

【CMake】CMake构建项目入门

一、CMake介绍 CMake 是一个跨平台的自动化构建工具,用于管理软件项目的编译过程。它通过简单的配置文件(CMakeLists.txt)生成特定平台的构建文件(如 Makefile、Visual Studio 项目),让开发者可以专注于代…

贪心算法题解——划分字母区间【LeetCode】

763. 划分字母区间 本题目,“同一字母最多出现在一个片段中”,因为这句话,所以本质上 这道题目属于合并区间 一、算法逻辑(逐步思路) ✅ 目标: 将字符串 s 划分成尽可能多的片段,要求&#xf…

Python----目标检测(使用YOLOV8网络训练人脸)

一、Ultralytics安装 网址:主页 -Ultralytics YOLO 文档 Ultralytics提供了各种安装方法,包括pip、conda和Docker。通过 ultralytics pip包安装最新稳定版本的YOLOv8,或克隆Ultralytics GitHub 存储库以获取最新版本。可以使用Docker在隔离的…

Filament引擎(三) ——引擎渲染流程

通过Filament引擎(二) ——引擎的调用及接口层核心对象的介绍我们知道,要在项目中使用filament,首先我们需要构建出filament的Engine的对象,然后通过filament::Engine对象实例,来构建其他对象,组装渲染场景&#xff0c…

Oracle存储过程导出数据到Excel:全面实现方案详解

技术背景与需求分析 数据导出是企业级应用的核心功能,Oracle存储过程因其高性能执行(减少网络传输)、代码复用性(封装业务逻辑)和事务安全性(ACID保障)成为理想载体。Excel作为使用率$ \geq 95% $的办公工具,其兼容性需求尤为突出。典型场景包括: 财务报表自动生成物…

解决el-table右下角被挡住部分

一部分展示不全&#xff0c;被遮挡&#xff0c;因为 最右边加了fixed"right"<el-table-column fixed"right" label"操作" width"120">解决&#xff1a;1、去除fixed"right"或2、设置样式单页面<style lang"sc…

Waiting for server response 和 Content Download

在浏览器网络调试&#xff08;如 Chrome DevTools 的 Network 面板&#xff09;中&#xff0c;Timing 选项卡下的 Waiting for server response 和 Content Download 是两个关键性能指标&#xff0c;它们分别代表了 HTTP 请求生命周期的不同阶段。以下是详细解释和优化方案&…

《Java Web程序设计》实验报告五 Java Script学习汇报

目 录 一、实验目的 二、实验环境 三、实验步骤和内容 1、小组成员分工&#xff08;共计4人&#xff09; 2、实验方案 3、实验结果与分析 Ⅰ、简述JavaScript的产生过程与Java的关系 Ⅱ、简述JavaScript的特点有哪些 Ⅲ、简述ECMAScript的历史 Ⅳ、简述ECMAScript与J…

C#与FX5U进行Socket通信

实现效果实现步骤&#xff1a;注意&#xff1a;详细的参数这里就不说明了&#xff0c;自己网上搜即可&#xff1b;打开GX Works3 创建FX5U项目系统参数设置PLC的具体型号&#xff08;我有实物PLC&#xff09;设置IP及组态参数添加通讯设备&#xff08;这里PLC做客户端&#xff…

ubuntu20.04基于tensorRT和c++跑yolo11

设备 系统&#xff1a;Ubuntu 20.04 显卡&#xff1a;NVIDIA GeForce RTX 3050 显卡驱动&#xff1a; Driver Version: 535.183.01 CUDA Version: 12.2 关键软件版本总结 Cmake: 3.28.6 Cuda&#xff1a; 12.2.2 Cudnn: 8.9.7 TensorRT: 10.8.0.43 Python&#xff1a;3.10.1…

玖玖NFT数字藏品源码(源码下载)

玖玖NFT数字藏品源码 这套还是很不错的&#xff0c;前端uniapp&#xff0c;后端FastAdmin&#xff0c;对接汇元支付&#xff0c;富友支付&#xff0c;对接avata链&#xff0c;感兴趣的自行下载研究 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/9133…

【Redis-05】高可用方案-主从哨兵

1 概述 高可用&#xff08;High Availability&#xff09;指系统在部分节点故障时仍能持续提供服务的能力。Redis 作为核心缓存组件&#xff0c;主流的高可用方案有主从复制、哨兵模式、集群模式三种。本文介绍主从复制、哨兵模式两种高可用方案。 2 主从复制 通过 “一主多从”…

焊接机器人智能节气装置

工业焊接作为现代制造业的重要组成部分&#xff0c;广泛应用于汽车、航空航天、建筑、船舶等多个领域。随着自动化技术的快速发展&#xff0c;焊接机器人已成为提升焊接效率和质量的关键装备。在传统焊接及部分自动化焊接过程中&#xff0c;气体流失问题仍然普遍存在&#xff0…

【6.1.0 漫画数据库技术选型】

漫画数据库技术选型 &#x1f3af; 学习目标&#xff1a;掌握架构师核心技能——数据库技术选型&#xff0c;针对不同业务场景选择最合适的数据库方案 &#x1f3db;️ 第一章&#xff1a;关系型数据库对比选型 &#x1f914; MySQL vs PostgreSQL vs TiDB 想象数据库就像不同…

CVE-2022-4262/CVE-2022-3038

CVE-2022-4262&#xff08;Linux内核UAF漏洞&#xff09;漏洞原理CVE-2022-4262是Linux内核中RDS&#xff08;Reliable Datagram Sockets&#xff09;协议实现的一个UAF&#xff08;Use-After-Free&#xff0c;释放后使用&#xff09;漏洞。具体来说&#xff1a;在rds_rdma_ext…

[Token]Token merging for Vision Generation

Token Compression for Vision Domain_Generation 文章目录Image GenerationToken Merging for Fast Stable Diffusion, CVPRW 2023.Token Fusion: Bridging the Gap between Token Pruning and Token Merging, WACV 2024ToDo: Token Downsampling for Efficient Generation of…

React封装过哪些组件-下拉选择器和弹窗表单

背景&#xff08;S - Situation&#xff09;&#xff1a;在某活动管理系统中&#xff0c;前端页面需要支持用户选择“要配置的当前活动”&#xff0c;并提供「新增」「编辑」功能&#xff0c;操作内容包括填写活动名称、ID、版本号等字段。原始实现逻辑分散、复用性差&#xff…

多租户架构下的多线程处理实践指南

在现代 SaaS 系统中&#xff0c;多租户架构&#xff08;Multi-Tenant Architecture&#xff09;已成为主流。然而&#xff0c;随着系统性能要求的提升和业务复杂度的增加&#xff0c;多线程成为不可避免的技术手段。但在多租户环境下使用多线程&#xff0c;容易引发数据错乱、租…