当前位置: 首页 > news >正文

swift入门与进阶和iOS开发实践技巧

在多个target 之间经常存在功能类似,通过粘贴类实现功能,这会导致后续代码很难维护的问题。类要在在不同的 target 之间复用,复用的方式通过 XCode 进行一次设置即可实现。

20251216191146856
这是一个存储工具类,将所有存储相关收敛在这个类中,避免分散在应用各处,难于管理。在主app与 Widget 之间实现了复用,提升开发效率,同时降低了未来的维护成本。代码复用方式,复用在存储的时候注意应用本身使用的是default,而跨 Widget 是有命名空间来进行区分。同时在在方法层面也通过加 Widget 的方式来标识方法是在小组件中使用。
//检查七言诗是否已购买 func isSevenCharacterPoemsPurchased() -> Bool {        //再检查标准UserDefaults        let standardUserDefaults = UserDefaults.standard        let poem = standardUserDefaults.string(forKey: Constant.poemSegmentIndex)                if poem == "1" || poem == "2" {                        return true        }                return false }        //检查小组件七言诗是否已购买 func isSevenCharacterPoemsPurchasedWidget() -> Bool {                if let userDefaults = UserDefaults(suiteName: "group.com") {                        let poem = userDefaults.string(forKey: Constant.poemSegmentIndex)                        if poem != nil {                if poem == "1" || poem == "2" {                                        return true                } else if poem == "0" {                                        return false                }            }        }                return false }
另外一个技巧是类的规划,相关方向的能力,渐变背景、雨雪动画、本地存储相关、简体繁体相关,都抽象成相关工具类,这些类在多个 Controller 实现复用,本身即提升系统的可维护性,同时易于持续迭代。
20251216191146858
每个类和方法根据系统研发,持续的抽取出来,这样的代码量会逐渐的合并与减少。
class NetworkManager {    // 单例实例    static let shared = NetworkManager()     // 私有化初始化方法,防止外部创建实例    private init() {        print("NetworkManager 初始化")    }     func fetchData() {        print("获取数据中...")    }} // 使用NetworkManager.shared.fetchData()
Swift 中使用单例,进行网络数据的获取,通过单例可以保障系统中对象只有一个。并且是使用的地方构建对象极其简单。单例也常用在全局信息的获取,是一种常用的设计模式,用好它后很多研发与应用场景明显便利不少。

Swift 为闭包提供了很多语法简化规则,合理使用能大幅减少代码量。当闭包是函数的最后一个参数时,可以使用尾随闭包;参数可以用$0、$1等缩写;如果闭包只有一行返回语句,还能省略return。
// 原始写法:遍历数组并映射成新数组let numbers = [1, 2, 3, 4]let squaredNumbers = numbers.map({ (num: Int) -> Int in    return num * num})// 简化1:省略类型(Swift类型推断)let squaredNumbers1 = numbers.map({ num in return num * num })// 简化2:参数缩写 + 隐式返回let squaredNumbers2 = numbers.map({ $0 * $0 })// 简化3:尾随闭包(最常用)let squaredNumbers3 = numbers.map { $0 * $0 }
当函数的闭包参数是可选的,可给它设置空闭包默认值,避免调用时频繁写{}
// 定义函数时给闭包参数设置默认空闭包func fetchData(completion: () -> Void = {}) {    // 模拟异步请求    DispatchQueue.global().asyncAfter(deadline: .now() + 1) {        completion()    }}// 调用时,若不需要回调,可直接调用,无需传闭包fetchData()// 需要回调时再传闭包fetchData {    print("数据请求完成")}
Swift 是一种语法较为复杂的语言,需要在研发过程中,持续的学习它的语法,并且结合功能实践。输入学习(官方文档、书籍、互联网、大模型)-输出(应用发研发)-输入学习(调整对理论的理解)。通过持续循环以上过程实现对于 swift 入门与进阶。

http://www.jsqmd.com/news/100334/

相关文章:

  • 软件测试面试题(测试自用)
  • 使用MBDVidia进行三维MBD模型管理:PMI自动检查与修复+质量检测信息整合与分析
  • OpenAI聘请谷歌高管Albert Lee担任企业发展副总裁
  • 杰理之部分WAV歌曲会误识别成DTS格式解码【篇】
  • Docker MCP 网关负载均衡调优案例实录(99%工程师忽略的关键参数)
  • net 是原始TCP,http是基于TCP的HTTP协议封装 - jerry
  • Dify重排序核心技术解析(20年经验总结的3大选型原则)
  • 从代码到用户手中:我的应用上架实战与核心技能突破之路
  • 背包DP
  • yolov5实现游戏图像识别与后续辅助功能
  • AI 手机技术拆解:豆包手机 vs AutoGLM,两条“AI 手机”技术路线深度拆解
  • 音频切片效率提升300%?Dify 1.7.0配置优化实战经验分享
  • 全球USB厂商与设备ID大全
  • 抖音代运营服务商-官方百科
  • 普通耳机秒变AI翻译神器!谷歌Gemini加持,实时翻译还能传情绪
  • 论面向服务的体系结构在系统集成中的应用
  • 使用LabelImg工具标注数据(游戏辅助脚本开发)
  • Dify对接Spring AI总失败?一文看懂版本依赖的4大雷区
  • 30亿参数小模型如何媲美千亿级大模型?Nanbeige4-3B的技术突破与实践指南
  • Python期末复习:30个核心知识点完全详解
  • 私有化Dify SSL配置全流程(含自签名与CA证书对比实测)
  • 为什么你的Agent服务无法自动扩展?深度解析Docker Compose配置盲区
  • 想提升Agent集成效率?Dify元数据定义必须搞懂的5个技术细节
  • 吉时利DMM7510 DMM6500数字万用表
  • 科研少走弯路:智慧芽新药情报库到底值不值?
  • 【珍藏版】AI大模型学习路线大全:从入门到精通,附104G免费资源包
  • 【运维专家亲授】:Agent服务容器化中数据卷挂载的99%人都忽略的关键细节
  • 为什么99%的量子计算项目忽略镜像缓存?这3个致命后果你承担得起吗?
  • 揭秘R Shiny多模态报告生成:如何在5步内构建高可用、可复用的智能报告系统
  • 阿里开源的Mobile-Agent:让AI帮你操作手机电脑,这个工具太强了