【swift】struct与class 的区别

数据类型:struct是值类型,class是引用类型。

值类型变量直接包含数据,赋值时也是值拷贝,或者叫深拷贝,所以多个变量的操作不会相互影响。

引用类型变量存储的是对数据的引用地址,后者称为对象,赋值时,是将对象的引用地址复制过去,也叫浅拷贝,因此若多个变量指向同一个对象时,操作会相互影响。

值类型数据没有引用计数,也就不会因为循环引用导致内存泄漏,而引用类型存在引用计数,需要小心循环引用导致的内存泄漏

拷贝时,struct是深拷贝,拷贝的是内容,class则需要选用正确的深浅拷贝类型。

因为值类型数据是深拷贝,所以是线程安全的,而引用类型数据则不是

property的初始化:初始化属性时,class 需要创建一个带形参的constructor;struct可以把属性放在默认的constructor 的参数里。

immutable变量:swift用var和let区分可变数据和不可变数据,struct遵循这个特性;对class则不适用。

mutating function:struct 的 function 改变 property 时,需加上 mutating,而 class 不用。

速度:struct分配在栈中,class分配在堆中,也就意味着struct更迅速。

NSUserDefaults:struct 不能被序列化成 NSData 对象,class可以。

继承: struct不可以继承,class可以继承。

ps: struct 可以直接解析出来,不用引用第三方,但是 还是 有区别的。swift与oc混合开发时,oc调用swift需要继承NSObject,这就导致了class可以继承,所以可以调用class,但struct不能继承,所以不能调用struct

Swift 复制代码
struct AIListModel: Codable {
    let pages: Int
    let list: [AIListItem]
    let pageSize: Int
    let total: Int
    let pageNum: Int
}  
  CMNetWorkManage.getAIIntelligenceList(withType: 1, classifyID: Id, pageNum: pageNum, pageSize: 1) { model in
            let code = model.code
            if isValidDic(model.content) && code == 200 {
                do {
                    let jsonData = try JSONSerialization.data(withJSONObject: model.content, options: .prettyPrinted)
                    let listModel = try JSONDecoder().decode(AIListModel.self, from: jsonData)
                    completion(listModel)
                } catch {
                    print("Error decoding JSON: \(error)")
                    completion(nil)
                }
            }else {
                completion(nil)
            }
        }
    }
相关推荐
可乐鸡翅yeah_5 小时前
hls.js 内存泄漏实战排查,直播 M3U8 长时间播放异常定位方案
开发语言·javascript·python·django·ecmascript·m3u8·m3u8在线
2601_962203516 小时前
Java进阶07集合(续)
java·开发语言
郑州光合科技余经理6 小时前
本地生活服务系统:模块边界与结算字段怎么拆
java·开发语言·前端·后端·系统架构·uni-app·php
来了就未晚6 小时前
Python基础 学习代码存储与命名规范
开发语言·python·学习
布莱克6057 小时前
数组详解:定义、作用、应用场景及与链表的区别(C/C++ 代码讲解)
c语言·开发语言·c++·数组
hongmai6668887 小时前
MP2348GTL-Z:这颗24V/4A同步降压芯片,把性能和体积平衡得恰到好处
c语言·开发语言·arm开发·单片机·5g
多弗朗皮卡丘7 小时前
C语言梦开始的地方19:文件操作
c语言·开发语言
Dovis(誓平步青云)7 小时前
折叠屏悬停看视频,上半屏和下半屏应该各做什么
android·java·服务器·开发语言·安全·音视频
benchmark_cc7 小时前
Python量化实战:如何检测并剔除历史数据中的“闪崩/乌龙指”异常价格点?
开发语言·人工智能·python·量化·quantdash·量化数据源
2501_937860947 小时前
Java多线程初阶(下)—— synchronized、volatile、wait/notify与经典并发工具
java·开发语言·jvm