swift中类'nil'中的所有值

时间:2015-11-16 20:33:46

标签: ios xcode swift macos class

我最近在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

我错过了一些明显的东西吗?任何帮助将不胜感激。谢谢!

3 个答案:

答案 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)