From ff1349aa137d0578fd49edddd147e8d460a85df0 Mon Sep 17 00:00:00 2001 From: DJYohann Date: Wed, 7 Jun 2023 19:55:26 +0200 Subject: [PATCH] :sparkles: Add model with stub and view-model --- src/App/App.xcodeproj/project.pbxproj | 4 ++ .../xcschemes/xcschememanagement.plist | 2 +- src/App/Views/UEEditSheet.swift | 29 ++++++++ src/App/Views/UEView.swift | 20 +++--- .../contents.xcworkspacedata | 6 ++ .../UserInterfaceState.xcuserstate | Bin 45714 -> 67977 bytes src/Model/Sources/Model/Bloc.swift | 10 ++- src/Model/Sources/Model/Manager.swift | 5 ++ src/Model/Sources/Model/Matiere.swift | 16 ++++- src/Model/Sources/Model/UE.swift | 37 ++++++++-- src/Model/Tests/ModelTests/ModelTests.swift | 11 --- src/Stub/.gitignore | 9 +++ src/Stub/Package.swift | 29 ++++++++ src/Stub/README.md | 3 + .../Model => Stub/Sources/Stub}/Stub.swift | 20 ++++-- src/ViewModel/.gitignore | 9 +++ src/ViewModel/Package.swift | 29 ++++++++ src/ViewModel/README.md | 3 + src/ViewModel/Sources/ViewModel/BlocVM.swift | 42 +++++++++++ .../Sources/ViewModel/MatiereVM.swift | 55 ++++++++++++++ src/ViewModel/Sources/ViewModel/UEVM.swift | 68 ++++++++++++++++++ 21 files changed, 370 insertions(+), 37 deletions(-) create mode 100644 src/App/Views/UEEditSheet.swift create mode 100644 src/Model/Sources/Model/Manager.swift delete mode 100644 src/Model/Tests/ModelTests/ModelTests.swift create mode 100644 src/Stub/.gitignore create mode 100644 src/Stub/Package.swift create mode 100644 src/Stub/README.md rename src/{Model/Sources/Model => Stub/Sources/Stub}/Stub.swift (88%) create mode 100644 src/ViewModel/.gitignore create mode 100644 src/ViewModel/Package.swift create mode 100644 src/ViewModel/README.md create mode 100644 src/ViewModel/Sources/ViewModel/BlocVM.swift create mode 100644 src/ViewModel/Sources/ViewModel/MatiereVM.swift create mode 100644 src/ViewModel/Sources/ViewModel/UEVM.swift diff --git a/src/App/App.xcodeproj/project.pbxproj b/src/App/App.xcodeproj/project.pbxproj index ba62493..22cfc71 100644 --- a/src/App/App.xcodeproj/project.pbxproj +++ b/src/App/App.xcodeproj/project.pbxproj @@ -20,6 +20,7 @@ 1E0D89172A1E838700786FE3 /* UEListItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E0D89162A1E838700786FE3 /* UEListItem.swift */; }; 1E0D891B2A1E9BEF00786FE3 /* UEView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E0D891A2A1E9BEF00786FE3 /* UEView.swift */; }; 1E160AB22A1FA51600ECDB3F /* NoteSlider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E160AB12A1FA51600ECDB3F /* NoteSlider.swift */; }; + 1E4D71792A29E50A008342F0 /* UEEditSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E4D71782A29E50A008342F0 /* UEEditSheet.swift */; }; 1EDC99232A20DDAB00C3561D /* NoteInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EDC99222A20DDAB00C3561D /* NoteInfo.swift */; }; /* End PBXBuildFile section */ @@ -56,6 +57,7 @@ 1E0D89162A1E838700786FE3 /* UEListItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UEListItem.swift; sourceTree = ""; }; 1E0D891A2A1E9BEF00786FE3 /* UEView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UEView.swift; sourceTree = ""; }; 1E160AB12A1FA51600ECDB3F /* NoteSlider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NoteSlider.swift; sourceTree = ""; }; + 1E4D71782A29E50A008342F0 /* UEEditSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UEEditSheet.swift; sourceTree = ""; }; 1EDC99222A20DDAB00C3561D /* NoteInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NoteInfo.swift; sourceTree = ""; }; /* End PBXFileReference section */ @@ -159,6 +161,7 @@ 1E0D891A2A1E9BEF00786FE3 /* UEView.swift */, 1E160AB12A1FA51600ECDB3F /* NoteSlider.swift */, 1EDC99222A20DDAB00C3561D /* NoteInfo.swift */, + 1E4D71782A29E50A008342F0 /* UEEditSheet.swift */, ); path = Views; sourceTree = ""; @@ -303,6 +306,7 @@ 1E0D88E32A1E759A00786FE3 /* AppApp.swift in Sources */, 1EDC99232A20DDAB00C3561D /* NoteInfo.swift in Sources */, 1E0D891B2A1E9BEF00786FE3 /* UEView.swift in Sources */, + 1E4D71792A29E50A008342F0 /* UEEditSheet.swift in Sources */, 1E0D89172A1E838700786FE3 /* UEListItem.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/src/App/App.xcodeproj/xcuserdata/djyohann.xcuserdatad/xcschemes/xcschememanagement.plist b/src/App/App.xcodeproj/xcuserdata/djyohann.xcuserdatad/xcschemes/xcschememanagement.plist index b04f406..74c9b79 100644 --- a/src/App/App.xcodeproj/xcuserdata/djyohann.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/src/App/App.xcodeproj/xcuserdata/djyohann.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,7 +7,7 @@ App.xcscheme_^#shared#^_ orderHint - 0 + 3 diff --git a/src/App/Views/UEEditSheet.swift b/src/App/Views/UEEditSheet.swift new file mode 100644 index 0000000..1b0ca10 --- /dev/null +++ b/src/App/Views/UEEditSheet.swift @@ -0,0 +1,29 @@ +import SwiftUI + +struct UEEditSheet: View { + var body: some View { + NavigationStack { + VStack { + Text("SALUT") + } + .toolbar { + ToolbarItem(placement: .cancellationAction) { + Button(action: {}) { + Text("Cancel") + } + } + ToolbarItem(placement: .confirmationAction) { + Button(action: {}) { + Text("Save") + } + } + } + } + } +} + +struct UEEditSheet_Previews: PreviewProvider { + static var previews: some View { + UEEditSheet() + } +} diff --git a/src/App/Views/UEView.swift b/src/App/Views/UEView.swift index 231cc7d..1cc57f7 100644 --- a/src/App/Views/UEView.swift +++ b/src/App/Views/UEView.swift @@ -1,13 +1,8 @@ -// -// UEView.swift -// App -// -// Created by BREUIL Yohann on 24/05/2023. -// - import SwiftUI struct UEView: View { + @State private var showingSheet = false + var body: some View { NavigationStack { ScrollView { @@ -47,8 +42,15 @@ struct UEView: View { .padding() .navigationTitle("UE1 Génie logiciel") .toolbar { - Button(action: {}) { - Text("Edit") + ToolbarItem { + Button(action: { + showingSheet = true + }) { + Text("Edit") + } + .sheet(isPresented: $showingSheet) { + UEEditSheet() + } } } } diff --git a/src/AverageCalculator.xcworkspace/contents.xcworkspacedata b/src/AverageCalculator.xcworkspace/contents.xcworkspacedata index 7f870fa..c11534a 100644 --- a/src/AverageCalculator.xcworkspace/contents.xcworkspacedata +++ b/src/AverageCalculator.xcworkspace/contents.xcworkspacedata @@ -1,6 +1,12 @@ + + + + diff --git a/src/AverageCalculator.xcworkspace/xcuserdata/djyohann.xcuserdatad/UserInterfaceState.xcuserstate b/src/AverageCalculator.xcworkspace/xcuserdata/djyohann.xcuserdatad/UserInterfaceState.xcuserstate index d274cf75c6a35f1c0a1f801fd86a9f80d97d0716..48904335846d040b0950566965358cce5947c5e5 100644 GIT binary patch literal 67977 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

ed?5n$Vikn$fze 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%0DYV zR(_r$nSxCrr_fW_DN0iYPEna+HYIpU(G=N~?Ne@5AywK{ZdLJB8CBU;ldAHo%B!SR z)2bS(nyXr?+N$PPEvi~twXAAo)#|DvRTrwRR9&mOS#_`KLDl1`r&aH(CDlsRgQ}%N ztJSMVRO?n7R2x-~sWz()s-9FWR8Oz&s$NjNsCsGjit1I>YpT~(@2);xeXIIz^@Hli z)z7MbseV=cd-dDu57i&1Do<6LI(X{Psl%sgPSu(^YO2mu{i%jiji-*AnmM&)>bj}t zroO9DuW_h}t|_ajtpPRlHH|ehYv$I>uUS~LSX#5RrnhE8&8C{IH9Kl{*X*siUh|~p zmzq~Kzty~}`LpI@&F5Oac3`b$?WkIvTK!s+TGLvKTB}-*+K}3e+U(j%wUcX$YD;S? zYO88%YK7Xm+Q!;NwM%PzYnRuqto^QbUG0Y2A8I$(ZmZoReKn3gb2 zI&Ims6VqPS@pUG3esy7W5p@&mV(L=sCe`KF71R~gmDH8hO{;6DYp!dpYp?65TVJ=U zZeQJjy2EuR>Q2}FRCm7aZry{r*LCmf{;K<2FR7>M*?PWyV7*Gc)Vw~VKCM2leoB39 zy-;6Q-(25X-(KHQzodR${h|7!^(X32*Z)+1q5e|+)%qLtx9jiKKdk>)|969=0d2q= zs0Ow{sX@6xwPA3>(1zg+V;dqHrZg;Q*w^r=k!dt+9M_oMnBQ2~SkhS5Sligt*wWb6 z*wH9!oYUCdxV&*y;~Ht>`o@ion;L&=yxDlK@j>I`#utq*8(%m6-h?#aO-fDbO{1E0 zn+%$an=G4bn#MLcG&wbmZz^bNYwBv6+q9x-P1Cxj4NY5`wl(c++TC=r=}ObDO}{n0 zX?oxESJUTaNi)_=HZ#q9^T1~PW}{}4X47W#W~*kKX1ivGW~XM?W~qC#XLC|>ZF6t) z;pV5)2TZq`9yYyjdfW7_>GP&9oW6Mas_7f2Z=Sww`p)TlrvEs7|MWA{&rQEL{qpo{ z({D`w&_cAZElMo|TL!fZZBcL0Y%ysuYjJAvZ1HLFYYA+b&=T1)u_d-8zNM;VUd#6_ z+glE|oM<`Ka<=7S%jK49EjL=8OIzNz@~s0~Ra*zQ4r|qD9oagnRkzik)wtEI)w9*R z)wk8JHLx|fHMBLXHKH}DHM+H|b$08H*6Xc*&(NLWHzR9C9!fP8MT?TIkq{s`L{_! z+Qzqqw?((bwk5PBwM}lTZkyKD(AM16+Sb`Nr)_TAg0@9%KeoMV*J>ZrZrN_rZrASI z?$++v?%f{Op5C6=wcl=k(*9ff zo0(QKon{8ljF_1)GjnFn%vCeD%-lY6*UY`rnfqrR?2vRY9jYCJJ4Sctbr^P-beMHm zbhvhSc7%4McVuE0>z>h$gO?+olr@051V?>y6avGYdft5Xm@mXes^Jaad&BVdH0m=som1WV2H#ho!0Luh4V*mgE diff --git a/src/Model/Sources/Model/Bloc.swift b/src/Model/Sources/Model/Bloc.swift index 7899e39..040a244 100644 --- a/src/Model/Sources/Model/Bloc.swift +++ b/src/Model/Sources/Model/Bloc.swift @@ -1,18 +1,22 @@ import Foundation -public struct Bloc: Identifiable { +public struct Bloc: Identifiable, Equatable { public let id: UUID public var name: String public var ues: [UE] - init(id: UUID, name: String, ues: [UE]) { + public init(id: UUID, name: String, ues: [UE]) { self.id = id self.name = name self.ues = ues } - init(name: String, ues: [UE]) { + public init(name: String, ues: [UE]) { self.init(id: UUID(), name: name, ues: ues) } + + public static func == (lhs: Bloc, rhs: Bloc) -> Bool { + return lhs.id == rhs.id + } } diff --git a/src/Model/Sources/Model/Manager.swift b/src/Model/Sources/Model/Manager.swift new file mode 100644 index 0000000..249f60f --- /dev/null +++ b/src/Model/Sources/Model/Manager.swift @@ -0,0 +1,5 @@ +import Foundation + +struct Manager { + +} diff --git a/src/Model/Sources/Model/Matiere.swift b/src/Model/Sources/Model/Matiere.swift index 95d7a30..e3fb0db 100644 --- a/src/Model/Sources/Model/Matiere.swift +++ b/src/Model/Sources/Model/Matiere.swift @@ -1,20 +1,30 @@ import Foundation -public struct Matiere : Identifiable { +public struct Matiere : Identifiable, Equatable { public let id: UUID public var name: String public var factor: Int public var note: Float - init(id: UUID, name: String, factor: Int, note: Float) { + public var realNote: Float { + get { + return note * Float(factor) + } + } + + public init(id: UUID, name: String, factor: Int, note: Float) { self.id = id self.name = name self.factor = factor self.note = note } - init(name: String, factor: Int, note: Float) { + public init(name: String, factor: Int, note: Float) { self.init(id: UUID(), name: name, factor: factor, note: note) } + + public static func == (lhs: Matiere, rhs: Matiere) -> Bool { + return lhs.id == rhs.id + } } diff --git a/src/Model/Sources/Model/UE.swift b/src/Model/Sources/Model/UE.swift index 550627f..03585e2 100644 --- a/src/Model/Sources/Model/UE.swift +++ b/src/Model/Sources/Model/UE.swift @@ -1,14 +1,14 @@ import Foundation -public struct UE: Identifiable { +public struct UE: Identifiable, Equatable { public let id: UUID - public var number: Int + public var number: Int32 public var name: String - public var factor: Int + public var factor: Int32 public var matieres: [Matiere] - init(id: UUID, number: Int, name: String, factor: Int, matieres: [Matiere]) { + public init(id: UUID, number: Int32, name: String, factor: Int32, matieres: [Matiere]) { self.id = id self.number = number self.name = name @@ -16,7 +16,34 @@ public struct UE: Identifiable { self.matieres = matieres } - init(number: Int, name: String, factor: Int, matieres: [Matiere]) { + public init(number: Int32, name: String, factor: Int32, matieres: [Matiere]) { self.init(id: UUID(), number: number, name: name, factor: factor, matieres: matieres) } + + public mutating func addMatiere(matiere: Matiere) -> Void { + matieres.append(matiere) + } + + public mutating func addMatieres(matieres: Matiere...) -> Void { + self.matieres.append(contentsOf: matieres) + } + + public func findMatiereByName(name: String) -> Matiere? { + if let index = matieres.firstIndex(where: { $0.name == name }) { + return findMatiereByIndex(index: index); + } + return nil + } + + public func findMatiereByIndex(index: Int) -> Matiere { + return matieres[index]; + } + + public mutating func delMatiere(index: Int) -> Void { + matieres.remove(at: index) + } + + public static func == (lhs: UE, rhs: UE) -> Bool { + return lhs.id == rhs.id + } } diff --git a/src/Model/Tests/ModelTests/ModelTests.swift b/src/Model/Tests/ModelTests/ModelTests.swift deleted file mode 100644 index 38c36bb..0000000 --- a/src/Model/Tests/ModelTests/ModelTests.swift +++ /dev/null @@ -1,11 +0,0 @@ -import XCTest -@testable import Model - -final class ModelTests: XCTestCase { - func testExample() throws { - // This is an example of a functional test case. - // Use XCTAssert and related functions to verify your tests produce the correct - // results. - XCTAssertEqual(Model().text, "Hello, World!") - } -} diff --git a/src/Stub/.gitignore b/src/Stub/.gitignore new file mode 100644 index 0000000..3b29812 --- /dev/null +++ b/src/Stub/.gitignore @@ -0,0 +1,9 @@ +.DS_Store +/.build +/Packages +/*.xcodeproj +xcuserdata/ +DerivedData/ +.swiftpm/config/registries.json +.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata +.netrc diff --git a/src/Stub/Package.swift b/src/Stub/Package.swift new file mode 100644 index 0000000..1a98407 --- /dev/null +++ b/src/Stub/Package.swift @@ -0,0 +1,29 @@ +// swift-tools-version: 5.8 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "Stub", + products: [ + // Products define the executables and libraries a package produces, and make them visible to other packages. + .library( + name: "Stub", + targets: ["Stub"]), + ], + dependencies: [ + // Dependencies declare other packages that this package depends on. + // .package(url: /* package url */, from: "1.0.0"), + .package(name: "Model", path: "../Model") + ], + targets: [ + // Targets are the basic building blocks of a package. A target can define a module or a test suite. + // Targets can depend on other targets in this package, and on products in packages this package depends on. + .target( + name: "Stub", + dependencies: ["Model"]), + .testTarget( + name: "StubTests", + dependencies: ["Stub"]), + ] +) diff --git a/src/Stub/README.md b/src/Stub/README.md new file mode 100644 index 0000000..a016ae1 --- /dev/null +++ b/src/Stub/README.md @@ -0,0 +1,3 @@ +# Stub + +A description of this package. diff --git a/src/Model/Sources/Model/Stub.swift b/src/Stub/Sources/Stub/Stub.swift similarity index 88% rename from src/Model/Sources/Model/Stub.swift rename to src/Stub/Sources/Stub/Stub.swift index 72db421..156688c 100644 --- a/src/Model/Sources/Model/Stub.swift +++ b/src/Stub/Sources/Stub/Stub.swift @@ -1,8 +1,11 @@ +import Model import Foundation public struct Stub { - func loadBlocs() -> [Bloc] {[ - Bloc(name: "Total", ues: [ + public func loadBlocs() -> [Bloc] { + var blocs: [Bloc] = [] + + var bloc1 = Bloc(name: "Total", ues: [ UE(number: 1, name: "Génie logiciel", factor: 6, matieres: [ Matiere(name: "Processus de développement", factor: 4, note: 19.04), Matiere(name: "Programmation objets", factor: 9, note: 9.08), @@ -35,8 +38,9 @@ public struct Stub { Matiere(name: "QT Quick", factor: 5, note: 10), Matiere(name: "Xamarin", factor: 5, note: 10) ]), - ]), - Bloc(name: "Projet / Stage", ues: [ + ]) + + var bloc2 = Bloc(name: "Projet / Stage", ues: [ UE(number: 6, name: "Projet", factor: 9, matieres: [ Matiere(name: "Projet", factor: 1, note: 10) ]), @@ -44,5 +48,11 @@ public struct Stub { Matiere(name: "Stage", factor: 1, note: 10) ]) ]) - ]} + + blocs.append(contentsOf: [bloc1, bloc2]) + + return blocs + } + + } diff --git a/src/ViewModel/.gitignore b/src/ViewModel/.gitignore new file mode 100644 index 0000000..3b29812 --- /dev/null +++ b/src/ViewModel/.gitignore @@ -0,0 +1,9 @@ +.DS_Store +/.build +/Packages +/*.xcodeproj +xcuserdata/ +DerivedData/ +.swiftpm/config/registries.json +.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata +.netrc diff --git a/src/ViewModel/Package.swift b/src/ViewModel/Package.swift new file mode 100644 index 0000000..a40bdb2 --- /dev/null +++ b/src/ViewModel/Package.swift @@ -0,0 +1,29 @@ +// swift-tools-version: 5.8 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "ViewModel", + products: [ + // Products define the executables and libraries a package produces, and make them visible to other packages. + .library( + name: "ViewModel", + targets: ["ViewModel"]), + ], + dependencies: [ + // Dependencies declare other packages that this package depends on. + // .package(url: /* package url */, from: "1.0.0"), + .package(name: "Model", path: "../Model") + ], + targets: [ + // Targets are the basic building blocks of a package. A target can define a module or a test suite. + // Targets can depend on other targets in this package, and on products in packages this package depends on. + .target( + name: "ViewModel", + dependencies: ["Model"]), + .testTarget( + name: "ViewModelTests", + dependencies: ["ViewModel"]), + ] +) diff --git a/src/ViewModel/README.md b/src/ViewModel/README.md new file mode 100644 index 0000000..74e3704 --- /dev/null +++ b/src/ViewModel/README.md @@ -0,0 +1,3 @@ +# ViewModel + +A description of this package. diff --git a/src/ViewModel/Sources/ViewModel/BlocVM.swift b/src/ViewModel/Sources/ViewModel/BlocVM.swift new file mode 100644 index 0000000..eeae83d --- /dev/null +++ b/src/ViewModel/Sources/ViewModel/BlocVM.swift @@ -0,0 +1,42 @@ +import Foundation +import Model + +@available(iOS 13.0, *) +public class BlocVM : ObservableObject, Identifiable { + public init(model: Bloc) { + self.model = model + } + + public var id: UUID { model.id } + + @Published + var model: Bloc = Bloc(id: UUID(), name: "", ues: []) { + didSet { + if self.name != model.name { + self.name = self.model.name + } + + if self.ues != model.ues { + self.ues = self.model.ues + } + } + } + + @Published + var name: String = "" { + didSet { + if self.name != self.model.name { + self.name = self.model.name + } + } + } + + @Published + var ues: [UE] = [] { + didSet { + if self.ues != self.model.ues { + self.ues = self.model.ues + } + } + } +} diff --git a/src/ViewModel/Sources/ViewModel/MatiereVM.swift b/src/ViewModel/Sources/ViewModel/MatiereVM.swift new file mode 100644 index 0000000..b6d09d4 --- /dev/null +++ b/src/ViewModel/Sources/ViewModel/MatiereVM.swift @@ -0,0 +1,55 @@ +import Foundation +import Model + +@available(iOS 13.0, *) +class MatiereVM : ObservableObject, Identifiable { + public init(model: Matiere) { + self.model = model + } + + public var id: UUID { model.id } + + @Published + var model: Matiere = Matiere(id: UUID(), name: "", factor: 0, note: 0) { + didSet { + if self.name != model.name { + self.name = self.model.name + } + + if self.factor != model.factor { + self.factor = self.model.factor + } + + if self.note != model.note { + self.note = self.model.note + } + } + } + + @Published + var name: String = "" { + didSet { + if model.name != self.model.name { + self.name = self.model.name + } + } + } + + @Published + var factor: Int = 0 { + didSet { + if model.factor != self.model.factor { + self.factor = self.model.factor + } + } + } + + @Published + var note: Float = 0 { + didSet { + if model.note != self.model.note { + self.note = self.model.note + } + } + } +} diff --git a/src/ViewModel/Sources/ViewModel/UEVM.swift b/src/ViewModel/Sources/ViewModel/UEVM.swift new file mode 100644 index 0000000..2ad4b6b --- /dev/null +++ b/src/ViewModel/Sources/ViewModel/UEVM.swift @@ -0,0 +1,68 @@ +import Foundation +import Model + +@available(iOS 13.0, *) +public class UEVM : ObservableObject, Identifiable { + public init(model: UE) { + self.model = model + } + + public var id: UUID { model.id } + + @Published + var model: UE = UE(id: UUID(), number: 0, name: "", factor: 0, matieres: []) { + didSet { + if self.number != self.model.number { + self.number = self.model.number + } + + if self.name != self.model.name { + self.name = self.model.name + } + + if self.factor != self.model.factor { + self.factor = self.model.factor + } + + if self.matieres != self.model.matieres { + self.matieres = self.model.matieres + } + } + } + + @Published + var number: Int32 = 0 { + didSet { + if model.number != self.model.number { + self.number = self.model.number + } + } + } + + @Published + var name: String = "" { + didSet { + if model.name != self.model.name { + self.name = self.model.name + } + } + } + + @Published + var factor: Int32 = 0 { + didSet { + if model.factor != self.model.factor { + self.factor = self.model.factor + } + } + } + + @Published + var matieres: [Matiere] = [] { + didSet { + if model.matieres != self.model.matieres { + self.matieres = self.model.matieres + } + } + } +}