我的解决方案对这个问题是否正确?成员和自定义初始化程序

时间:2019-06-30 23:36:27

标签: swift

制作具有两个可变属性heightInInches和heightInCentimeters的Height结构。两者都应为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 :(得分:0)

我建议您将转换移至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方法调用。您必须复制此转换或将其放置在另一个将在初始化 didSet中调用的函数中。

答案 1 :(得分:0)

备份一秒钟,并隔离每个需求

  

一个初始化程序将使用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

    }
}

这是最好再留一天的课程;)