Asignación a constante en el inicializador Swift

En mi file Ball.swift , declaré la siguiente variable:

 let r:Double = 0 

Ahora tengo el siguiente inicializador:

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

Estoy teniendo el siguiente error:

 Cannot assign to 'r' in 'self' 

Sin embargo, en los documentos de Swift de Apple aquí, dicen:

Puede asignar un valor a una propiedad constante en cualquier punto durante la initialization, siempre que se establezca en un valor definido en el momento en que finalice la initialization.

No entiendo. ¿No debería funcionar esto? He buscado mucho en línea pero no puedo encontrar nada. Estaba pensando solo en convertirlo en una variable, pero siento que eso sería darse por vencido. 🙂

Debe declarar r sin valor inicial, como sigue:

 let r: Double 

A partir de Swift 1.2, una constante solo se puede asignar una vez. Si le das un valor pnetworkingeterminado, no puedes darle otro valor en init .

Puede asignar un valor a una propiedad constante en cualquier punto durante la initialization, siempre que se establezca en un valor definido en el momento en que finalice la initialization. Una vez que se asigna un valor a una propiedad constante, no se puede modificar más .

Puede definir una propiedad constante sin asignar un valor

 let r:Double // = 0 

entonces tú puedes:

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

está dando let r:Double = 0 al principio, y lo cambia en las funciones init. Esta no es la forma en que funciona.

Por ejemplo:

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

Según la documentation que citó en su publicación, siempre debe inicializar la superclass antes de poder usarla en su class.

¿De qué class henetworkingó tu class? Supongamos que se henetworkingó, en este caso su inicializador sería un inicializador de conveniencia, los inicializadores convenientes pueden simplemente llamar a los inicializadores locales, por lo que su código se vería así:

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

Si, por otro lado, estás henetworkingando de una class que tiene un inicializador similar, lo anularías y llamarás al super inicializador, así:

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