Back to Easydict

Swift 迁移进度追踪

docs/exec-plans/active/swift-migration.md

2.22.013.2 KB
Original Source

Swift 迁移进度追踪

状态: active 最后复核: 2026-08-09 类型: 长期迁移路线图

📋 迁移政策

核心原则

  • ✅ 所有新功能使用 Swift/SwiftUI 实现
  • 绝对禁止添加新的 Objective-C 文件
  • 🔄 修改现有 Objective-C 代码前,必须先迁移到 Swift
  • ⚡ 重写 Objective-C 代码必须使用 Swift
  • 🚫 任何形式的 Objective-C 代码扩展都被禁止

强制要求

  • Swift/SwiftUI 是项目未来的唯一技术栈
  • Objective-C 代码仅允许 bug 修复
  • 所有贡献者必须遵守此政策
  • 违反此政策的 PR 将被拒绝

项目概述

Easydict 是一个 macOS 翻译和词典应用,正在进行从 Objective-C 到 Swift + SwiftUI 的逐步迁移。

✅ 已完成迁移

2024-2025 年迁移记录

翻译服务层

服务名称原文件名新文件名完成时间提交记录
Google 翻译EZGoogleTranslateGoogleService2024-12refactor(objc-to-swift): migrate EZGoogleTranslate to Swift
Bing 翻译EZBingServiceBingService2024-12refactor(objc-to-swift): migrate EZBingService to Swift
有道翻译EZYoudaoTranslateYoudaoService2024-12refactor(objc-to-swift): migrate EZYoudaoTranslate to Swift
NiuTrans 翻译EZNiuTransTranslateNiuTransService2024-12refactor(objc-to-swift): migrate EZNiuTransTranslate to Swift
DeepL 翻译EZDeepLTranslateDeepLService2024-12refactor(objc-to-swift): migrate EZDeepLTranslate to Swift
苹果词典EZAppleDictionaryAppleDictionary2025-01refactor(objc-to-swift): migrate EZAppleDictionary to Swift
百度翻译EZBaiduTranslateBaiduService2025-03refactor(objc-to-swift): migrate EZBaiduTranslate to Swift

核心基类

名称原文件名新文件名完成时间提交记录
查询服务基类EZQueryServiceQueryService2025-03refactor(objc-to-swift): migrate EZQueryService to Swift

字符串处理层

组件名称原文件名新文件名完成时间备注
文本分割NSString+EZSplitString+Split2025-01-29分割驼峰和下划线文本
输入文本处理NSString+EZHandleInputTextString+HandleInputText2025-01-29完整的输入文本处理功能
字符串便利NSString+EZConvenienceString+Convenience2025-02-17URL 编码、剪贴板、XML 转义、MD5 等

AI 服务层

服务名称状态备注
OpenAIGPT-4 集成
DeepSeekDeepSeek API
GeminiGoogle Gemini
Ollama本地模型支持
Volcano火山翻译
月之暗面Kimi API
零一万物Yi API
智谱清言ChatGLM
通义千问阿里云大模型
腾讯混元腾讯大模型
百度文心百度大模型
Coze字节跳动 AI
阿里通义已完成
MiniMax海螺 AI

基础设施层

组件名称原文件名新文件名状态
有序字典MMOrderedDictionaryMMOrderedDictionary
AppleScript-AppleScriptIntegration
文本选择AXUITextSelection
离线翻译-OfflineTranslation
SwiftPM-Package.swift
暗色模式DarkModeManager/NSObject+DarkMode/SingletonDarkModeManager.swift + Extensions
服务信息EZServiceInfoEZServiceInfo.swift
本地存储EZLocalStorageEZLocalStorage.swift
应用模型EZAppModelEZAppModel.swift
服务类型EZServiceTypesServiceTypes.swift

工具扩展层

扩展名称原文件名新文件名状态
字符串布局-String+Layout
颜色扩展NSColor+...NSColor+...
日志EZLogEZLog.swift
设备信息EZDeviceSystemInfoEZDeviceSystemInfo.swift

📊 迁移统计

  • 翻译服务: 6/13 已完成 (46%)
  • AI 服务: 14/14 已完成 (100%)
  • 基础设施: 10/10 已完成 (100%)
  • 工具扩展: 5/15 已完成 (33%)

✅ 已完成迁移

2025-01-29:NSString+EZHandleInputText

  • 目标: 成功创建 String+HandleInputText.swift
  • 状态: ✅ 完成
  • 实际时间: 1 天
  • 成果:
    • 创建了 String+Split.swift 依赖文件
    • 创建了 String+HandleInputText.swift 主要实现
    • 创建了 String+HandleInputTextTests.swift 完整测试
    • 更新了 bridging header 移除旧 import
    • 修复了 AppleDictionary.swift 中的调用
    • 修复了所有 SwiftLint 违规和编译错误
    • 通过了所有 SwiftLint 检查(0 个问题)

2025-01-30:DarkMode 模块重构

  • 目标: 使用 Swift 完全重写 DarkMode 模块
  • 状态: ✅ 完成
  • 实际时间: 1 天
  • 成果:
    • 创建了 DarkModeManager.swift 统一的暗色模式管理器
    • 创建了 DarkModeProtocol.swift 提供响应式暗色模式协议
    • 创建了 NSObject+DarkMode.swiftNSView+DarkMode.swift 扩展
    • 使用 Combine 替代 ReactiveObjC,移除额外依赖
    • 更新了 AppDelegate.mConfiguration.swift 的调用
    • 移除了 4 个 Objective-C 文件和整个 DarkMode 目录
    • 更新了 PrefixHeader.pch 移除旧导入
    • 更新了 docs/exec-plans/active/swift-migration.md 记录迁移进度

2025-02-17:NSString+EZConvenience

  • 目标: 使用 Swift 重写 NSString+EZConvenience
  • 状态: ✅ 完成
  • 成果:
    • 新增 String+Convenience.swift,覆盖 URL 编码/解码、剪贴板操作、XML 转义、MD5、段落拆分等方法
    • 删除旧的 Objective-C 分类,更新 PCH、Bridging Header 和 Xcode 工程引用

2025-12-17:存储层重构

  • 目标: 迁移存储相关类到 Swift
  • 状态: ✅ 完成
  • 成果:
    • 迁移 EZServiceInfo 到 Swift,添加 Codable 支持
    • 迁移 EZLocalStorage 到 Swift,使用现代属性访问器
    • 保持 @objcMembers 注解以兼容 Objective-C 代码
    • 更新 bridging header 移除不再需要的导入

2025-12-17:应用模型迁移

  • 目标: 迁移 EZAppModel 到 Swift
  • 状态: ✅ 完成
  • 成果:
    • 从 objc/Legacy/ 迁移到 Swift/Model/
    • 添加全面的文档注释
    • 实现 NSSecureCoding 协议
    • 添加便捷的字典转换方法
    • 移除 MJExtension/KVC 依赖

2025-12-16:服务类型注册

  • 目标: 迁移 EZServiceTypes 到 Swift
  • 状态: ✅ 完成
  • 成果:
    • 使用 ServiceTypes.swift 替换 EZServiceTypes.h/.m
    • 保持 API 兼容性,使用 @objc 属性
    • 保留单例模式和所有公共方法
    • 更新代码库中的所有导入语句

2025-12-18:类名规范化

  • 目标: 重命名类以符合更清晰的命名约定
  • 状态: ✅ 完成
  • 成果:
    • 统一命名规范,提高代码可读性
    • 更新相关引用和文档

2025-12-17:DeepL API 清理

  • 目标: 移除未使用的 DeepL API 枚举和相关代码
  • 状态: ✅ 完成
  • 成果:
    • 删除 EZDeepLTranslationAPI 枚举
    • 清理冗余代码,简化架构

2025-12-20:EZQueryResult 迁移

  • Goal:将 EZQueryResult 及相关词条结果模型迁移到 Swift。
  • Status: ✅ 已完成
  • Outcome
    • Swift/Service/Model/EZQueryResult.swift 中添加 Swift 实现。
    • 移除 Objective-C EZQueryResult.h/.m,并将 ObjC 头文件更新为前置声明。
    • 更新工程引用以使用 Swift 实现。

2025-12-22:EZLog 和 EZDeviceSystemInfo 迁移

  • Goal:将 EZLog 和 EZDeviceSystemInfo 迁移为 Swift 工具类。
  • Status: ✅ 已完成
  • Outcome
    • 添加 Swift/Utility/Logging/EZLog.swiftSwift/Utility/DeviceInfo/EZDeviceSystemInfo.swift
    • 更新 ObjC 调用方以导入 Easydict-Swift.h
    • 从 build phase 中移除遗留 ObjC 源文件。

2026-01-06:EZDetectManager 迁移

  • Goal:将 EZDetectManager 迁移到 Swift,用于文本检测和 OCR 功能。
  • Status: ✅ 已完成
  • Outcome
    • 添加包含完整实现的 Swift/Service/Model/DetectManager.swift
    • 使用 @objc(EZDetectManager)@objcMembers 保持 Objective-C 兼容性。
    • 添加方法的 async/await 版本,供 Swift 代码使用。
    • 更新 EZBaseQueryViewController.m 以导入 Easydict-Swift.h
    • 更新 Easydict-Bridging-Header.h,注释掉旧的 Objective-C 导入。

📋 待迁移列表

⚠️ 重要提醒:以下所有 Objective-C 组件修改时必须先迁移到 Swift,禁止直接修改!

核心服务(高优先级)

  1. EZDetectManager ✅ - 文本检测管理器
    • 位置: Swift/Service/Model/DetectManager.swift
    • 影响: 语言检测和 OCR 功能
    • 优先级: 高
    • ✅ 已完成迁移到 Swift
    • 状态: ✅ 完成
    • 实际时间: 2026-01-06
    • 成果:
      • 创建了 Swift/Service/Model/DetectManager.swift 完整的 Swift 实现
      • 使用 @objc(EZDetectManager)@objcMembers 保持 Objective-C 兼容性
      • 添加了 async/await 版本的方法支持 Swift 代码调用
      • 更新了 EZBaseQueryViewController.m 导入 Easydict-Swift.h
      • 更新了 Easydict-Bridging-Header.h 注释掉旧的 Objective-C 导入

应用架构(中优先级)

  1. AppDelegate - 应用代理

    • 位置: objc/AppDelegate.h/.m
    • 影响: 应用生命周期管理
    • 优先级: 中高
    • ⚠️ 重写时必须使用 Swift
  2. EZWindowManager - 窗口管理器

    • 位置: objc/ViewController/Window/EZWindowManager.h/.m
    • 影响: 所有窗口功能
    • 优先级: 中高
    • ⚠️ 禁止修改,必须迁移到 Swift
  3. EZLocalStorage - 本地存储 ✅

    • 已于 2025-12-17 迁移到 Swift
    • 新位置: objc/ViewController/Storage/EZLocalStorage.swift

UI 和交互(中优先级)

  1. EZBaseQueryViewController - 基础查询控制器
    • 位置: objc/ViewController/Window/BaseQueryWindow/EZBaseQueryViewController.m
    • 行数: ~1700 行
    • 影响: 核心用户界面
    • 优先级: 中
    • ⚠️ 禁止修改,必须迁移到 Swift

工具类(低优先级)

  1. NSString+EZChineseText - 中文文本处理
    • ⚠️ 禁止修改,必须迁移到 Swift
  2. NSString+EZUtils - 字符串工具
    • ⚠️ 禁止修改,必须迁移到 Swift
  3. NSString+EZSplit - 文本分割
    • ⚠️ 禁止修改,必须迁移到 Swift
  4. NSColor+MyColors - 颜色扩展
    • ⚠️ 重写时必须使用 Swift
  5. EZLanguageManager - 语言管理
    • ⚠️ 重写时必须使用 Swift
  6. EZEventMonitor - 事件监控
    • ⚠️ 重写时必须使用 Swift
  7. EZLog - 日志工具
    • ⚠️ 重写时必须使用 Swift
  8. DarkModeManager - 深色模式
    • ⚠️ 重写时必须使用 Swift
  9. MMLog - 日志框架
    • ⚠️ 重写时必须使用 Swift
  10. MMCrash - 崩溃处理
    • ⚠️ 重写时必须使用 Swift

🚀 迁移计划

🚨 重要约束:禁止添加新的 Objective-C 代码,所有重写必须使用 Swift

第一阶段:核心功能 (Q1 2025)

  • Apple Dictionary
  • EZQueryService (基类) - 已迁移至 Swift
  • EZBaiduTranslate - 已迁移至 Swift
  • EZDetectManager - 必须使用 Swift

第二阶段:应用架构 (Q2 2025)

  • EZLocalStorage - ✅ 已完成 (2025-12-17)
  • AppDelegate - 必须使用 Swift
  • EZWindowManager - 禁止修改,必须迁移到 Swift
  • EZLanguageManager - 必须使用 Swift

第三阶段:用户界面 (Q3 2025)

  • EZBaseQueryViewController - 禁止修改,必须迁移到 Swift
  • 其他 ViewController - 必须使用 Swift

第四阶段:工具和优化 (Q4 2025)

  • 所有 NSString 扩展 - 禁止修改,必须迁移到 Swift
  • 日志和监控 - 必须使用 Swift
  • 性能优化 - 必须使用 Swift
  • 完全移除 Objective-C

📈 质量保证

代码质量

  • ✅ SwiftLint 检查通过
  • ✅ 单元测试覆盖
  • ✅ 代码审查
  • ✅ 性能测试

功能验证

  • ✅ 所有原有功能保持不变
  • ✅ 新增功能符合设计
  • ✅ 兼容性测试
  • ✅ 用户反馈收集

🚨 Objective-C 代码冻结政策

  • 绝对禁止添加新的 Objective-C 文件
  • 🔍 代码审查:拒绝任何新的 Objective-C 代码
  • 🚫 Objective-C 代码仅允许 bug 修复
  • 📈 Swift/SwiftUI 作为未来的唯一技术栈
  • 🛡️ CI 检查:防止新的 .m/.h 文件提交

🎯 里程碑

  • 2024年12月: 完成主要翻译服务迁移
  • 2025年1月: 完成 Apple Dictionary 和 AI 服务
  • 2025年3月: 完成核心服务层
  • 2025年6月: 完成应用架构层
  • 2025年9月: 完成 UI 层
  • 2025年12月: 完全 Swift 化

🔗 相关资源


最后更新: 2025-12-22