• 【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
     

    1. struct AIListModel: Codable {
    2. let pages: Int
    3. let list: [AIListItem]
    4. let pageSize: Int
    5. let total: Int
    6. let pageNum: Int
    7. }
    8. CMNetWorkManage.getAIIntelligenceList(withType: 1, classifyID: Id, pageNum: pageNum, pageSize: 1) { model in
    9. let code = model.code
    10. if isValidDic(model.content) && code == 200 {
    11. do {
    12. let jsonData = try JSONSerialization.data(withJSONObject: model.content, options: .prettyPrinted)
    13. let listModel = try JSONDecoder().decode(AIListModel.self, from: jsonData)
    14. completion(listModel)
    15. } catch {
    16. print("Error decoding JSON: \(error)")
    17. completion(nil)
    18. }
    19. }else {
    20. completion(nil)
    21. }
    22. }
    23. }

  • 相关阅读:
    html相关
    Vue3.X笔记总结
    BES耳机空间音频技术实现
    十大创新方向发布 悬镜安全强势领跑软件供应链安全与开发安全
    Mysql出现问题:什么是prepare语句解决方案
    使用VC++输出调频波
    【C】atoi和offsetof的介绍和模拟实现
    JS_——九九乘法表
    Rxjs TakeUntil 操作符的学习笔记
    python之 ffmpeg+opencv绿幕抠图,蒙版绿幕抠图,透明化处理,PIL检测图片是否包含透明通道
  • 原文地址:https://blog.csdn.net/ochenmengo/article/details/136471182