制作具有两个可变属性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。
答案 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
}
}
这是最好再留一天的课程;)