在我的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,中,他们说:
您可以在任何时候为常量属性赋值 初始化,只要它按时间设置为一个确定的值 初始化完成。
我不明白。这不行吗?我在网上搜索了很多,但找不到任何东西。我只是想把它变成一个变量,但我觉得这样会放弃。 :)
答案 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
}