Vous êtes sur la page 1sur 23

Classes

Contexte
Classe ou structure?
• Toujours créer de nouveaux types avec une structure
• Utiliser une classe si:
- Un framework utilise des classes pour fonctionner
- La même instance doit être utiliser sur plusieurs interfaces
- Le modèle de donnée doit utiliser l’héritage
Memberwise initializers

• Contrairement aux structures, Swift ne crée pas de memberwise initializer pour


les classes
• Les développeurs doivent créer par eux même l’initializer pour leurs classes
• Si des valeurs à défaut sont définis pour toutes les propriétés d’une classe,
l’initializer se construit seul
Memberwise initializers

struct Drink {
var quantity: Int
var price: Double
}
Memberwise initializers

struct Drink {
var quantity: Int
var price: Double
}

class Drink {
var quantity: Int
var price: Double
}
Memberwise initializers

struct Drink {
var quantity: Int
var price: Double
}

class Drink {
var quantity: Int = 0
var price: Double = 0
}
Memberwise initializers

class Drink {
var quantity: Int
var price: Double

init(quantity: Int, price: Double) {


self.quantity = quantity
self.price = price
}
}
Inheritance

• Une classe qui hérite d’une autre classe est nommée subclass
• La classe dont elle hérite est nommée superclass
• Quelconque classe n’héritant d’aucunes autres est nommée base class
Inheritance

Base class & superclass: Drink


Subclass: Coffee
Inheritance
Base Class (& Superclass)
class Drink {
var quantity: Int
var price: Double

init(quantity: Int, price: Double) {


self.quantity = quantity
self.price = price
}
}

var someDrink = Drink(quantity: 1, price: 2)


Inheritance
Subclass
class SomeClass: SomeSuperclass {
//propriétés, méthodes, etc...
}

class Coffee: Drink {

}
Inheritance
Subclass
class Coffee: Drink {
var name: String
var brand: String

init(quantity: Int, price: Double, name: String, brand: String) {


self.name = name
self.brand = brand
super.init(quantity: quantity, price: price)
}
}

var someCoffee = Coffee(quantity: 1, price: 3.5, name: "Espresso", brand: "Lavazza")


References

• Quand vous créez l’instance d’une classe:


- Swift renvoi l’adresse de cette instance
- L’adresse est assignée à une variable
• Quand vous assignez l’adresse d’une instance à plusieurs variables:
- Chaque variable contient la même adresse
- Si une de ces instances est mise à jour, elles se réfèrent à cet instance et se
mettent toutes à jour en même temps
References

class Drink {
var quantity: Int
var price: Double

init(quantity: Int, price: Double) {


self.quantity = quantity
self.price = price
}
}

var someDrink = Drink(quantity: 1, price: 2)


var anotherDrink = someDrink

someDrink.quantity += 2

print(someDrink.quantity, anotherDrink.quantity)

3 3
References

struct Drink {
var quantity: Int
var price: Double

init(quantity: Int, price: Double) {


self.quantity = quantity
self.price = price
}
}

var someDrink = Drink(quantity: 1, price: 2)


var anotherDrink = someDrink

someDrink.quantity += 2

print(someDrink.quantity, anotherDrink.quantity)

3 1
SwiftUI

• On peut rendre les classes observables pour suivre chaque changement de la


donnée
• L’objet observé doit toujours être initialisé à la racine du projet pour être suivie
sur toute l’application
• Les variables d’environment observe et applique les changements sur toutes
l’application
SwiftUI

struct Drink: Identifiable {


var id: Int

var name: String


var brand: String
var image: String
let drinkTypes: DrinkType
var favorite: Bool = false
// autres propriétés...
}

enum DrinkType: String {


case coffee = "Café"
case tea = "Thé"
case none
}
SwiftUI

struct User: Identifiable {


var id: Int

var favoritesDrinks: [Drink]?


// autres propriétés...

init(id: Int, favoritesDrinks: [Drink]? = nil, ...) {


self.id = id
self.favoritesDrinks = favoritesDrinks
...
}
}
SwiftUI

class User: Identifiable {


var id: Int

var favoritesDrinks: [Drink]?


// autres propriétés...

init(id: Int, favoritesDrinks: [Drink]? = nil, ...) {


self.id = id
self.favoritesDrinks = favoritesDrinks
...
}
}
SwiftUI

class User: Identifiable, ObservableObject {


var id: Int

@Published var favoritesDrinks: [Drink]?


// autres propriétés...

init(id: Int, favoritesDrinks: [Drink]? = nil, ...) {


self.id = id
self.favoritesDrinks = favoritesDrinks
...
}
}
SwiftUI

struct ContentView: View {

@StateObject private var userSession = User(id: 0001, ...)

var body: some View {


TabView {
DrinkSelectionList()
.tabItem { Label("Drinks", systemImage: "mug.fill") }

FavoriteDrinkList()
.tabItem { Label("Favorites", systemImage: "heart.fill") }
}
.environmentObject(userSession)
}
}
SwiftUI

struct DrinkSelectionList: View {


@EnvironmentObject var user: User
@State private var drinkSelection = drinkList

var body: some View {


List(drinkSelection) { ... }
}
}

struct DrinkSelectionList_Previews: PreviewProvider {


static var previews: some View {
DrinkSelectionList()
.environmentObject(User(id: 0001, ...))
}
}

Vous aimerez peut-être aussi