我最近在swift中遇到了一个奇怪的问题。
基本上,我正在编写一个跟踪一些基本信息的小程序,并在某些行星上做一些计算,主要是为了练习。
为此,我最初设置了一个类来存储一些基本属性。接下来,我添加了几个行星,最后给每个行星赋予了一些特定的值。然而,尽管给出了值,每个行星的属性仍显示为“零”。以下是一些代码的示例:
class Body {
var distanceToSun:Float80 = 0.0
var mass:Float80 = 0.0
var radius:Float80 = 0.0
}
var Mercury:Body?
var Venus:Body?
var Earth:Body?
Mercury?.distanceToSun = 67790000
Mercury?.mass = 300000000000000000000000
Mercury?.radius = 2440
Venus?.distanceToSun = 108000000
Venus?.mass = (Mercury?.mass)! * 14.7
Venus?.radius = 6052
Earth?.distanceToSun = 147000000
Earth?.mass = (Venus?.mass)! * 1.266
Earth?.radius = 6378
print(Earth?.mass) // prints 'nil'
print(Mercury?.radius) // prints 'nil'
print(Mercury?.distanceToSun) // prints 'nil'
//etc etc
我错过了一些明显的东西吗?任何帮助将不胜感激。谢谢!
答案 0 :(得分:4)
这一切都符合预期。让我们来看一个案例:
guess
所以,var Mercury:Body?
是零,因为你从未将它分配给任何东西。然后执行:
Mercury
这表示“如果Mercury?.distanceToSun = 67790000
不是nil,请将此值指定给Mercury
。”因为当然distanceToSun
是零,所以没有任何作用。
我不清楚为什么这些都是可选项。只是让它们成为非可选项,并且大部分都可以按预期工作。更好的是,摆脱所有的默认值和选项,只是初始化。
Mercury
为什么这些都是变量?在你的计划中,水星不太可能显着改变它的质量。
答案 1 :(得分:1)
您从未实际初始化对象。更改为(我还使变量名称以小写字母开头):
var mercury = Body()
var venus = Body()
var earth = Body()
答案 2 :(得分:0)
您必须使用()
初始化程序初始化行星并删除所有可选内容
class Body {
var distanceToSun:Float80 = 0.0
var mass:Float80 = 0.0
var radius:Float80 = 0.0
}
var Mercury = Body()
var Venus = Body()
var Earth = Body()
Mercury.distanceToSun = 67790000
Mercury.mass = 300000000000000000000000
Mercury.radius = 2440
Venus.distanceToSun = 108000000
Venus.mass = (Mercury.mass) * 14.7
Venus.radius = 6052
Earth.distanceToSun = 147000000
Earth.mass = (Venus.mass) * 1.266
Earth.radius = 6378
print(Earth.mass)
print(Mercury.radius)
print(Mercury.distanceToSun)
使用struct
可能更方便,因为您可以免费获得成员智能初始化程序。
struct Body {
var distanceToSun:Float80 = 0.0
var mass:Float80 = 0.0
var radius:Float80 = 0.0
}
var Mercury = Body(distanceToSun: 67790000, mass: 300000000000000000000000, radius: 2440)
var Venus = Body(distanceToSun: 108000000, mass: (Mercury.mass) * 14.7, radius: 6052)
var Earth = Body(distanceToSun: 147000000, mass: (Venus.mass) * 1.266, radius: 6378)
print(Earth.mass)
print(Mercury.radius)
print(Mercury.distanceToSun)