Struct と Class

struct と struct mutating func、classの挙動の違い

import UIKit
 
 // model class
 class OkashiModelClass {
     let id: String
     var name: String
     let url: String
     
     init(id: String, name: String, url: String) {
         self.id = id
         self.name = name
         self.url = url
     }
     
     func change(newName: String) {
         self.name = newName
     }
     
     func compare(id: String, otherId: String) -> Bool {
         return id == otherId
     }
 }
 
 // codable entity
 struct OkashiEntity: Codable {
     let id: String
     let name: String
     let url: String
 }
 
 // struct model
 struct OkashiModel {
     let id: String
     let name: String
     let url: String
     
     init(entiry: OkashiEntity) {
         self.id = entiry.id
         self.name = entiry.name
         self.url = entiry.url
     }
     
     init(id: String, name: String, url: String) {
         self.id = id
         self.name = name
         self.url = url
     }
     
     func change(newName: String) -> OkashiModel {
         return OkashiModel(id: self.id, name: newName, url: self.url)
     }
     
     func compare(id: String, otherId: String) -> Bool {
         return id == otherId
     }
 }
 
 // mutating struct model
 struct OkashiModel2 {
     let id: String
     var name: String
     let url: String
     
     init(entiry: OkashiEntity) {
         self.id = entiry.id
         self.name = entiry.name
         self.url = entiry.url
     }
     
     init(id: String, name: String, url: String) {
         self.id = id
         self.name = name
         self.url = url
     }
     
     mutating func change(newName: String) {
         self.name = newName
     }
     
     func compare(id: String, otherId: String) -> Bool {
         return id == otherId
     }
 }
 
 // collection model
 struct OkashiModels {
     let elements: [OkashiModel]
     
     init(elements: [OkashiModel]) {
         self.elements = elements
     }
     
     func add(element: OkashiModel) -> OkashiModels {
         return OkashiModels(elements: self.elements + [element])
     }
 }
 
 
 //        let entiy = OkashiEntity(from: api.result)
 
 /// struct
 let chocolate = OkashiModel(id: "1", name: "chocolate", url: "http://fujiwara.com")
 let candy: OkashiModel = chocolate.change(newName: "candy")
 
 chocolate.name
 candy.name
 
 /// class
 let oreo = OkashiModelClass(id: "2", name: "oreo", url: "http://fujiwara.com")
 oreo.change(newName: "kitkat")
 oreo.name
   
 
 
 /// struct  (collection object)
 var okasiList = OkashiModels(elements: [])
 
 let gum = OkashiModel(id: "3", name: "gum", url: "http://fujiwara.com")
 let gummy = OkashiModel(id: "4", name: "gummy", url: "http://fujiwara.com")
 okasiList.add(gum)
 okasiList.add(gummy)
 
 print("okashi : \(okasiList)")