Swift开发总结

1.单例的实现

class Singleton {// 静态属性static let shared = Singleton()// 私有构造器,防止外部创建新实例private init() {}var someProperty: Int = 0func someMethod() {}
}
  1. static let shared = Singleton(): 声明一个静态的常量属性 shared,它是 Singleton 类型的单一实例。

  2. private init(): 将构造器设为 private,防止外部直接创建 Singleton 类的新实例。

  3. 在需要使用单例实例的地方,直接通过 Singleton.shared 进行访问和操作。

// 访问单例属性和方法
Singleton.shared.someProperty = 42
Singleton.shared.someMethod()
  • 线程安全: 由于 shared 属性是静态的常量,在多线程环境下也能保证只有一个单例实例。

  • 延迟初始化Singleton 类的实例会在第一次访问 shared 属性时才被创建,节省资源。

  • 可扩展性: 单例类可以像普通类一样添加属性和方法,满足不同的需求。

  • 可测试性: 由于构造器是 private 的,可以通过依赖注入的方式来测试使用单例的类。

2.struct 与 class 的区别

  • 值类型 vs 引用类型:

    • Struct 是值类型,当它被赋值给一个变量或常量,或者被传递给函数时,会创建一个新的副本。修改副本不会影响原始的 Struct 实例。
    • Class 是引用类型,当它被赋值给一个变量或常量,或者被传递给函数时,只会创建一个对该实例的引用。修改引用会影响原始的 Class 实例。
// Struct 示例
struct Person {var name: Stringvar age: Int
}var person1 = Person(name: "Alice", age: 30)
var person2 = person1
person2.name = "Bob"
print(person1.name) // Output: "Alice"
print(person2.name) // Output: "Bob"// Class 示例
class Person {var name: Stringvar age: Intinit(name: String, age: Int) {self.name = nameself.age = age}
}let person1 = Person(name: "Alice", age: 30)
let person2 = person1
person2.name = "Bob"
print(person1.name) // Output: "Bob"
print(person2.name) // Output: "Bob"
  • 继承:

    • Class 支持继承,可以创建子类并继承父类的属性和方法。
    • Struct 不支持继承,但可以使用协议来实现类似的功能。
  • 初始化:

    • class 在初始化时不能直接把 property 放在默认的 constructor 的参数里,而是需要自己创建一个带参数的 constructor。struct 可以把属性放在默认的 constructor 的参数里。
class Person {var name: Stringvar age: Intinit(name: String, age: Int) {self.name = nameself.age = age}
}let person = Person(name: "Alice", age: 30)struct Person {let name: Stringlet age: Int
}let person = Person(name: "Alice", age: 30)
  • deinit:

    • Class 支持 deinit 方法,可以在实例被销毁时执行清理操作。
    • Struct 没有 deinit 方法,因为它们是值类型,在超出作用域时会自动销毁。
// Class deinit 示例
class Person {var name: Stringinit(name: String) {self.name = nameprint("Person \(name) was initialized.")}deinit {print("Person \(name) was deinitialized.")}
}var person: Person? = Person(name: "Alice")
person = nil // Output: "Person Alice was deinitialized."// Struct 没有 deinit
struct Person {var name: String
}var person = Person(name: "Alice")
// No deinit called
  • 类型转换:

    • Class 支持类型转换,可以在运行时检查和转换类实例的类型。
    • Struct 不支持类型转换,因为它们是值类型,没有运行时类型信息。
// Class 类型转换示例
class Animal {}
class Dog: Animal {}
class Cat: Animal {}let animal: Animal = Dog()
if let dog = animal as? Dog {print("It's a dog!")
} else if let cat = animal as? Cat {print("It's a cat!")
} else {print("It's an unknown animal.")
}
  • 内存管理:

    • Class 实例需要手动管理内存,通常使用引用计数或自动引用计数(ARC)机制。
    • Struct 实例的内存管理是自动的,它们被分配在栈上,不需要手动管理。
  •  struct 的 function 要去改变 property 的值的时候要加上 mutating,而 class 不用。
struct Person {var name: Stringvar age: Intmutating func updateName(to newName: String) {name = newName}
}var person = Person(name: "Alice", age: 30)
person.updateName(to: "Bob")
print(person.name) // Output: "Bob"
  • struct 会自动生成需要的构造方法(constructor),哪个属性没有赋初始值就会生成以哪个属性为参数的构造方法。
struct Person {let name: Stringlet age: Int = 30
}let person = Person(name: "Alice") // Can call the constructor with name parameter
  • Struct 不能被序列化成 NSData 对象,原因是无法归解档。归解档的类必须遵守 NSCoding 协议,struct 不能遵守 NSCoding 协议。
  • 当项目的代码是 Swift 和 Objective-C 混合开发时,会发现在 Objective-C 的代码里无法调用 Swift 的 Struct。因为要在 Objective-C 里调用 Swift 代码的话,对象需要继承于 NSObject

总的来说,如果数据是简单的、不需要共享引用的,且不需要复杂的继承结构,使用 Struct 通常是更好的选择。而对于需要共享引用、继承、复杂内存管理的场景,使用 Class 会更合适。

未完待续。。。。。。

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

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

相关文章

[k8s源码]9.workqueue

client-go 是一个库,提供了与 Kubernetes API 服务器交互的基础设施。它提供了诸如 Informer、Lister、ClientSet 等工具,用于监听、缓存和操作 Kubernetes 资源。而自定义控制器则利用这些工具来实现特定的业务逻辑和自动化任务。业务逻辑实现&#xff…

初识dockerFile之RUN和WORKDIR

在Dockerfile中,RUN 和 WORKDIR 是两个常用的指令,用于定义容器镜像的构建过程和工作目录的设置。 RUN 指令: RUN 指令用于在容器镜像中执行命令。它可以运行任何有效的 Linux 命令、shell 脚本或可执行文件。在你的例子中,RUN mk…

sqlalchemy使用json_unquote函数查询mysql数组字段包含条件值

sqlalchemy使用json_unquote函数查询mysql数组字段包含条件值 在SQLAlchemy中使用 json_unquote 函数查询MySQL数组字段,查找包含特定条件值的记录,可以按以下步骤操作: 假设你有一个MySQL表 mymodel,其中包含一个名为 data 的字段,该字段存储了一个JSON数组的字符串,你…

【ROS2】演示:为有损网络使用服务质量设置

目录 背景 先决条件 运行演示 命令行选项 添加网络流量 背景 请阅读有关 QoS 设置的文档页面,以获取有关 ROS 2 中可用支持的背景信息。 在这个演示中,我们将生成一个发布相机图像的节点和另一个订阅图像并在屏幕上显示图像的节点。然后,我们…

Fedora40安装telnet-server启用telnet服务

Fedora40安装telnet-server启用telnet服务 安装 telnet-server sudo yum install telnet-server或 sudo dnf install telnet-server启用服务 fedora40 或 CentosStream9 不能用 yum或dnf安装xinetd, telnet-server 的服务名为: telnet.socket 启用 telnet.socket.service …

三、基础语法2(30小时精通C++和外挂实战)

三、基础语法2(30小时精通C和外挂实战) B-02内联函数B-04内联函数与宏B-05_constB-06引用B-07引用的本质B-08-汇编1-X86-X64汇编B-09-汇编2-内联汇编B-10-汇编3-MOV指令C-02-汇编5-其他常见指令C-05-汇编8-反汇编分析C-07-const引用、特点 B-02内联函数 …

基于Easyswoole或Hyperf作为基础技术栈的技术选型和架构设计

估算和架构设计建议: 业务量估算 用户群体:儿童及其家长,可能在特定时间段(如放学后、周末、假期)活跃度更高。地区分布:可能在某些地区(如中国、东南亚等)用户量更大。时间分布&a…

TreeSelect增加可筛选功能

TreeSelect官方可筛选示例 <template><el-tree-selectv-model"value":data"data"filterablestyle"width: 240px"/><el-divider /><el-divider />filter node method:<el-tree-selectv-model"value":data&q…

数据安全传输--加密算法

目录 古典加密算法与近代加密算法对比 算法分类 对称加密 常见的对称加密算法 在对称加密算法中密钥共享是一个很麻烦的问题 非对称加密 非对称加密过程 常见非对称加密算法 对称加密和非对称加密两者对比结论 DH算法 身份认证和数据认证技术 hash算法 hash算法特点…

PySide(PyQt),自定义图标按钮

1、在Qt Designer中新建画面&#xff0c;并放置3个按钮&#xff08;QPushButton&#xff09;和一个分组框&#xff08;QGroupBox&#xff09;小部件&#xff0c;分别命名为btn_1&#xff0c; btn_2&#xff0c;btn_3和btnStation。 2、将所有小部件的显示文字内容删除。 3、将…

Android 源码分析:ViewGroup

文章目录 ViewGroup添加View的两种方式 在布局文件中直接添加View在代码中调用ViewGroup.addView添加View ViewGroup添加View的两种方式 在布局文件中直接添加View 当加载布局文件&#xff0c;创建ViewTree时&#xff0c;向ViewGroup添加View会调用ViewGroup.generateLayoutP…

论文复现:Predictive Control of Networked Multiagent Systems via Cloud Computing

Predictive Control of Networked Multiagent Systems via Cloud Computing论文复现 文章目录 Predictive Control of Networked Multiagent Systems via Cloud Computing论文复现论文摘要系统参数初始化系统模型观测器预测过程控制器设计系统的整体框图仿真结果 论文摘要 翻译…

杰发科技Bootloader(2)—— 基于7840的Keil配置地址

序 在7840的sample代码里面有一个简单的Boot跳转APP的示例 PFlash地址从0开始 DFlash的地址从1000000开始 Boot解析 他的boot地址配置为0 Boot的代码主要是这几行&#xff0c;主要作用就是Flash的跳转 int main(void) {SystemClock_Config();InitDebug();printf("demo…

NSAT-8000与Chroma8000相比,有什么独特优势?

在电源模块的广泛应用推动下&#xff0c;测试效率成为行业关注的焦点。纳米软件响应这一需求&#xff0c;推出了NSAT-8000电源自动测试系统&#xff0c;其0代码操作模式大幅简化了测试流程。那么与Chroma 8000系统相比&#xff0c;有什么不同呢&#xff1f; 一、测试项目搭建 C…

nacos get changed dataId error, code: 403

nacos get changed dataId error, code: 403问题解决 问题出现原因&#xff1a;解决办法&#xff1a;需要在运行项目的配置添加权限账号和密码,重启服务 问题出现原因&#xff1a; 由于nacosserver开启了权限验证&#xff0c;项目启动时出现异常 nacos.core.auth.caching.ena…

数据结构->线性结构->顺序存储->静态链表

一、思路 链表由节点组成。 1、分析需求&#xff0c;画图&#xff1a; 2、定义学生结构体&#xff0c;包含姓名、年龄、性别和下一个学生的指针&#xff1a; #include <stdio.h> #define N 20// 定义性别枚举类型&#xff0c;固定值&#xff0c;不是男就是女 typedef e…

torchscript接口

一、定义 定义script、eager、onnx 模式对比案例生成的模型可以被c调用接口解读 二、实现 定义 可以在高性能环境libtorch&#xff08;C &#xff09;中直接加载&#xff0c;实现模型推理&#xff0c;而无需Pytorch训练框架依赖无需代码&#xff0c;直接加载模型&#xff0c…

国中水务:果汁能救“水”吗?

喝下汇源果汁有什么&#xff08;“功效”&#xff09;&#xff1f;这家公司最有发言权。 今天我们聊聊——国中水务。 最近&#xff0c;国中水务公告称拟通过收购&#xff0c;间接控股北京汇源&#xff0c;即将把“垂涎已久”的汇源收入囊中。 两家的故事得从几年前说起&#…

学习大数据DAY21 Linux基本指令2

目录 思维导图 搜索查看查找类 find 从指定目录查找文件 head 与 tail 查看行 cat 查看内容 more 查看大内容 grep 过滤查找 history 查看已经执行过的历史命令 wc 统计文件 du 查看空间 管道符号 | 配合命令使用 上机练习 4 解压安装类 zip unzip 压缩解压 tar …

木舟0基础学习Java的第二十一天(网络编程,反射)

网络编程 三要素&#xff1a;1.IP地址 2.端口 3.协议 InetAddress互联网协议 (IP) 地址 封装了IP地址的类 用法&#xff1a; public static void main(String[] args){//获取IP地址try {InetAddress iaInetAddress.getByName("www.baidu.com");System.out.println…