在Swift初始化程序

时间:2015-06-08 01:59:52

标签: ios swift constants

在我的Ball.swift文件中,我声明了以下变量:

let r:Double = 0

现在我有以下初始化程序:

init(x:Double, y:Double, radius:Double) {
    self.r = radius
}

我收到以下错误:

Cannot assign to 'r' in 'self'

然而,在Apple的Swift文档here,中,他们说:

  

您可以在任何时候为常量属性赋值   初始化,只要它按时间设置为一个确定的值   初始化完成。

我不明白。这不行吗?我在网上搜索了很多,但找不到任何东西。我只是想把它变成一个变量,但我觉得这样会放弃。 :)

4 个答案:

答案 0 :(得分:5)

您需要声明r没有初始值,如下所示:

let r: Double

从Swift 1.2开始,常量只能分配一次。如果您为其指定默认值,则无法在init中为其指定其他值。

答案 1 :(得分:1)

根据您在帖子中引用的文档,您必须始终初始化超类,然后才能在课堂上使用self。

您的班级继承自哪个班级?让我们假设它继承自,在这种情况下,您的初始化程序将是一个方便的初始化程序,方便的初始化程序可以只调用本地初始化程序,因此您的代码将如下所示:

convenience init(x:Double, y:Double, radius:Double) {
    self.init()
    self.r = radius
}

如果另一方面你从一个具有类似初始化程序的类继承,你将覆盖它并调用超级初始化程序,如下所示:

override init(x:Double, y:Double, radius:Double) {
    super.init(x, y, radius)
    self.r = radius
}

答案 2 :(得分:1)

您首先给予let r:Double = 0,然后在init函数中更改它。这不是它的工作方式。

例如:

let r : Double
init(x:Double, y:Double, radius:Double) {
    self.r = radius
}

init() {
    self.r = 0
}

答案 3 :(得分:1)

  

您可以在初始化期间的任何时刻为常量属性赋值,只要在初始化完成时将其设置为确定值即可。 为常量属性分配值后,无法进一步修改

您可以定义常量属性而不指定值

let r:Double // = 0

然后你可以:

init(x:Double, y:Double, radius:Double) {
    self.r = radius
}