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
英文地址,請注明出處:http://en.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;容易引發數據錯亂、租…