Не могу понять как используя Dictionary написать функцию внутри класса. Спасибо

class Car {
    
    let color: String
    let model: String
    var doors: [Int:String] = [:]
    let brand: String
    let state: String
    
    init (color: String, model: String, doors: [Int:String], brand: String, state: String) {
        self.color = color
        self.model = model
        self.doors = doors
        self.brand = brand
        self.state = state
    }
    
    
    func openDoor (numberDoor: Int) {
        
    }
    
    func closeDoor (numberDoor: Int) {
        
    }
    
    
    
}

let car = Car(color: "Black", model: "A8", doors: [1:"Door #1", 2: "Door #2"], brand: "Audi", state: "Stop")


Ответы (1 шт):

Автор решения: schmidt9

Если использовать словарь, то можно сделать так - завести еще один словарь, где сохранять состояние дверей

Вариант 1

class Car {
    
    let color: String
    let model: String
    var doors: [Int:String] = [:]
    let brand: String
    let state: String
    var doorsOpenState: [Int: Bool] = [:]
    
    init (color: String, model: String, doors: [Int:String], brand: String, state: String) {
        self.color = color
        self.model = model
        self.doors = doors
        self.brand = brand
        self.state = state
    }
    
    
    func openDoor (numberDoor: Int) {
        guard let doorName = doors[numberDoor] else {
            print("Invalid door number", numberDoor)
            return
        }
        let isDoorOpen = doorsOpenState[numberDoor] ?? false
        let doorStateMessage = isDoorOpen ? "is already opened" : "is opened"
        print(doorName, doorStateMessage)
        doorsOpenState[numberDoor] = true
    }
    
    func closeDoor (numberDoor: Int) {
        guard let doorName = doors[numberDoor] else {
            print("Invalid door number", numberDoor)
            return
        }
        let isDoorClosed = !(doorsOpenState[numberDoor] ?? false)
        let doorStateMessage = isDoorClosed ? "is already closed" : "is closed"
        print(doorName, doorStateMessage)
        doorsOpenState[numberDoor] = false
    }
    
}

let car = Car(color: "Black", model: "A8", doors: [1:"Door #1", 2: "Door #2"], brand: "Audi", state: "Stop")

car.openDoor(numberDoor: 1)
car.openDoor(numberDoor: 1)
car.openDoor(numberDoor: 1)
car.closeDoor(numberDoor: 1)
car.closeDoor(numberDoor: 1)

Но я бы сделал иначе - для большей связности я бы создал объект Door, чтобы хранить состояние сразу в нем

Вариант 2

class Car {
    
    class Door {
        var number: Int
        var name: String
        var isOpen: Bool
        
        init(number: Int, name: String, isOpen: Bool = false) {
            self.number = number
            self.name = name
            self.isOpen = isOpen
        }
    }
    
    let color: String
    let model: String
    var doors: [Door]
    let brand: String
    let state: String
    
    init (color: String, model: String, doors: [Door], brand: String, state: String) {
        self.color = color
        self.model = model
        self.doors = doors
        self.brand = brand
        self.state = state
    }
    
    
    func openDoor (numberDoor: Int) {
        guard numberDoor > 0 && numberDoor <= doors.count else {
            print("Invalid door number", numberDoor)
            return
        }
        let door = doors[numberDoor - 1]
        let doorStateMessage = door.isOpen ? "is already opened" : "is opened"
        print(door.name, doorStateMessage)
        door.isOpen = true
    }
    
    func closeDoor (numberDoor: Int) {
        guard numberDoor > 0 && numberDoor <= doors.count else {
            print("Invalid door number", numberDoor)
            return
        }
        let door = doors[numberDoor - 1]
        let doorStateMessage = !door.isOpen ? "is already closed" : "is closed"
        print(door.name, doorStateMessage)
        door.isOpen = false
    }
    
}

let car = Car(
    color: "Black",
    model: "A8",
    doors: [Car.Door(number: 1, name: "Door #1"), Car.Door(number: 2, name: "Door #2")],
    brand: "Audi",
    state: "Stop")
→ Ссылка