Правильно ли мое решение проблемы?Memberwise и пользовательские инициализаторы - PullRequest
1 голос
/ 01 июля 2019

Создайте структуру Height с двумя переменными свойствами, heightInInches и heightInCentimeters. Оба должны быть типа Double.

Создайте два пользовательских инициализатора. Один инициализатор примет аргумент Double, представляющий высоту в дюймах. Другой инициализатор примет аргумент Double, представляющий высоту в сантиметрах. Каждый инициализатор должен принимать переданное значение и использовать его для установки свойства, соответствующего переданной единице измерения. Затем он должен установить другое свойство, вычисляя правильное значение из переданного значения. Подсказка: 1 дюйм = 2,54 см.

struct Height{
    var heightInInches :Double=0.0
    var heightInCentimeters :Double=0.0

    init(inches:Double) {
        heightInInches=inches * 2.54
    }
    init(centimeters:Double) {
        heightInCentimeters=centimeters/2.54

    }


}
let inch = Height(inches:65)
print(inch.heightInInches)

let centi=Height(centimeters:65)
print(centi.heightInCentimeters)

Если вы используете инициализатор для прохождения дюймов в высоту 65, инициализатор должен установить heightInInches на 65 и heightInCentimeters на 165.1.

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

Резервное копирование на секунду и выполнение каждого требования по отдельности

Один инициализатор примет аргумент Double, представляющий высоту в дюймах. Другой инициализатор примет аргумент Double, представляющий высоту в сантиметрах.

Каждый инициализатор должен принимать переданное значение и использовать его для установки свойства, соответствующего переданной единице измерения.

Что может выглядеть примерно так ...

init(inches:Double) {
    heightInInches = inches
}

init(centimeters:Double) {
    heightInCentimeters = centimeters
}

Затем следует установить другое свойство путем вычисления правильного значения из переданного значения. Подсказка: 1 дюйм = 2,54 см.

Который может выглядеть больше так ...

init(inches:Double) {
    heightInInches = inches
    heightInCentimeters = inches * 2.54
}
init(centimeters:Double) {
    heightInInches = centimeters / 2.54
    heightInCentimeters = centimeters
}

Это тогда позволяет вам установить свойства как let и избежать всех проблем с мутацией struct

struct Height{
    let heightInInches: Double
    let heightInCentimeters: Double

    init(inches:Double) {
        heightInInches = inches
        heightInCentimeters = inches * 2.54
    }
    init(centimeters:Double) {
        heightInInches = centimeters / 2.54
        heightInCentimeters = centimeters

    }
}

который лучше оставить на следующий день;)

0 голосов
/ 01 июля 2019

Я предлагаю вам перевести конвертацию в didSet{} методы. Проблема здесь в том, что после инициализации, например, если вы измените heightInInches, heightInCentimeters не изменится.

struct Height{
    var heightInInches :Double {
        didSet {
            // called each time heightInInches changes
            heightInCentimeters = heightInInches / 2.54
        }
    }
    var heightInCentimeters :Double {
        didSet {
            // idem
            heightInInches = heightInCentimeters * 2.54
        }
    }

    init(inches:Double) {
        heightInInches = inches
        heightInCentimeters = inches / 2.54
    }
    init(centimeters:Double) {
        heightInCentimeters = centimeters
        heightInInches = centimeters * 2.54
    }
}

Обратите внимание, что didSet не вызывается через методы init. Вы должны продублировать это преобразование или поместить его в другую функцию, которая будет вызываться в init и didSet.

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