Ios 类中的所有值';无';迅速地

Ios 类中的所有值';无';迅速地,ios,xcode,swift,macos,class,Ios,Xcode,Swift,Macos,Class,我最近在swift中遇到了一个关于类的奇怪问题 基本上,我正在编写一个小程序,跟踪一些基本信息,并对一些行星进行一些计算,主要是为了实践 为此,我首先设置了一个类来存储一些基本属性。接下来,我添加了几个行星,最后给每个行星指定了一些特定的值。然而,尽管给出了值,每个行星的属性仍然显示为“nil”。下面是一些代码的示例: class Body { var distanceToSun:Float80 = 0.0 var mass:Float80 = 0.0 var radiu

我最近在swift中遇到了一个关于类的奇怪问题

基本上,我正在编写一个小程序,跟踪一些基本信息,并对一些行星进行一些计算,主要是为了实践

为此,我首先设置了一个类来存储一些基本属性。接下来,我添加了几个行星,最后给每个行星指定了一些特定的值。然而,尽管给出了值,每个行星的属性仍然显示为“nil”。下面是一些代码的示例:

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

我是不是漏掉了什么明显的东西?任何帮助都将不胜感激。谢谢

这一切都是意料之中的。让我们看一个案例:

var Mercury:Body?
因此,
Mercury
为零,因为您从未将其分配给任何对象。然后执行:

Mercury?.distanceToSun = 67790000
这表示“如果
Mercury
不为零,则将该值指定给
distanceToSun
”,因为
Mercury
当然为零,这不起任何作用

我不清楚为什么这些是可选的。只要将它们设置为非可选的,大部分都会按预期工作。更好的是,去掉所有的默认值和选项,只是初始化一些东西

class Body {
    let distanceToSun:Float80
    let mass:Float80
    let radius:Float80
}

let mercury = Body(distanceToSun: 6779000, mass = 300000000000000000000000, radius = 2440)

为什么这些都是变量?水星不太可能在你的程序运行期间显著改变它的质量。

这一切都是意料之中的。让我们看一个案例:

var Mercury:Body?
因此,
Mercury
为零,因为您从未将其分配给任何对象。然后执行:

Mercury?.distanceToSun = 67790000
这表示“如果
Mercury
不为零,则将该值指定给
distanceToSun
”,因为
Mercury
当然为零,这不起任何作用

我不清楚为什么这些是可选的。只要将它们设置为非可选的,大部分都会按预期工作。更好的是,去掉所有的默认值和选项,只是初始化一些东西

class Body {
    let distanceToSun:Float80
    let mass:Float80
    let radius:Float80
}

let mercury = Body(distanceToSun: 6779000, mass = 300000000000000000000000, radius = 2440)

为什么这些都是变量?水星不太可能在程序运行期间显著改变其质量。

您从未实际初始化过对象。更改为(我还将使变量名以小写字母开头):


您从未实际初始化过对象。更改为(我还将使变量名以小写字母开头):


您必须使用
()
初始值设定项初始化行星,并删除所有可选内容

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)

您必须使用
()
初始值设定项初始化行星,并删除所有可选内容

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)