Как я могу изменить значение свойства в подклассе в Swift? - PullRequest
0 голосов
/ 25 апреля 2018

Согласно главе «Наследование» в руководстве по быстрому языку, я пытался закодировать вычисленные значения в подклассе.Когда я установил newValue для свойства экземпляра класса, установщик, казалось, работал, в то время как значение свойства не преобразовывалось в newValue.

class Vehicle {
    var currentSpeed = 1.0
    var description: String {
        return "The current speed is \(currentSpeed) miles per hour"
    }
    func makeNoise() {
    }
}
class Car: Vehicle {
    var gear = 0
    override var description: String {
        return super.description + " in gear \(gear)"
    }
}
class AutomaticCar: Car {
    override var currentSpeed: Double {
        get {
            return super.currentSpeed
        }
        set {
            gear = Int(newValue/10) + 1
        }
    }
}

let automaticCar = AutomaticCar()
automaticCar.currentSpeed = 12.0
print(automaticCar.currentSpeed)//It prints "1.0"
print(automaticCar.description)//It prints "The current speed is 1.0 miles per hour in gear 2"

Значение свойства automaticCar.currentSpeed ​​по-прежнему равно "1.0", а не "12.0", в то время как свойство gear экземпляра, похоже, действует.Я искал, но не смог найти ответ, какой принцип приводит к этой ситуации?

Дальнейший вопрос:

class A {
    var test1 = 1
    var test2 = 2
    var sum: Int {
        get {
            return test1 + test2
        }
        set {
            test1 = newValue - test2
        }
    }
}
var a = A()
print(a.sum)
a.sum = 4
print(a.sum)//It ptints "4"
print(a.test1)//It prints "2"

В этом случае мне не нужно устанавливать значениеновая сумма собственности намеренно, в чем разница между двумя случаями?

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

В вашем реальном примере:

  • Автомобиль currentSpeed является сохраненным свойством.Это означает, что вы можете назначить его напрямую, и значение свойства изменится.

  • AutomaticCar currentSpeed фактически является другим свойством - вычисляется имущество.Это означает, что когда вы присваиваете ему все, что происходит, запускается функция set.В результате значения сохраненных свойств не изменятся, если только вы не измените их прямо здесь, в функции set.

Ну, в вашем AutomaticCar's currentSpeedset функция, вы не сохранили новое значение в сохраненном свойстве, автомобиль currentSpeed.Поэтому оно не изменилось, потому что ничего не произошло, что изменило бы его.

Как правильно сказал Хэмиш в комментарии, то, что вы имели в виду , чтобы сказать, вероятно, так:

class AutomaticCar: Car {
    override var currentSpeed: Double {
        didSet {
            self.gear = Int(self.currentSpeed/10) + 1
        }
    }
}

В этой формулировке AutomaticCar currentSpeed не является вычисляемым свойством;это - это Vehicle currentSpeed - это то же самое сохраненное свойство, что и наблюдатель-установщик.Поэтому, установив его, он устанавливает его, сохраняя новое значение - плюс теперь мы запускаем наблюдатель-установщик и вносим изменения в self.gear, которые вам нужны.

Обратите внимание, что переопределение сохраненного свойства в подклассе должно бытьодно или другое, либо независимое вычисляемое свойство, либо исходное сохраненное свойство с добавлением наблюдателя-установщика.Сам по себе он не может быть независимым хранимым свойством.

0 голосов
/ 25 апреля 2018
class AutomaticCar: Car {
    override var currentSpeed: Double {
        get {
            return super.currentSpeed
        }
        set {
            super.currentSpeed = newValue
            gear = Int(newValue/10) + 1
        }
    }
}

Вы просто забыли установить значение currentSpeed ​​в переопределенном установщике.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...