enum struct swift

enum - swift struct inheritance



No se puede asignar a ''X'' en ''Y'' en Swift (3)

Tengo un diccionario con Structs en él. Estoy tratando de asignar los valores de la struct cuando recorro el dictionary . Swift me dice que cannot assign to ''isRunning'' in ''blockStatus'' . No he podido encontrar nada en los documentos sobre esta inmutabilidad particular de dictionaries o structs .
Directamente desde el patio de recreo:

import Cocoa struct BlockStatus{ var isRunning = false var timeGapForNextRun = UInt32(0) var currentInterval = UInt32(0) } var statuses = ["block1":BlockStatus(),"block2":BlockStatus()] for (block, blockStatus) in statuses{ blockStatus.isRunning = true } cannot assign to ''isRunning'' in ''blockStatus'' blockStatus.isRunning = true

Esto funciona si cambio la struct a una class .

¿Supongo que tiene algo que ver con el hecho de que las estructuras se copian y se hace referencia a las clases?

EDIT: Entonces, incluso si lo está copiando ... ¿Por qué no puedo cambiarlo? Me daría un resultado incorrecto, pero puedes cambiar los miembros de las constantes, pero no la constante. Por ejemplo puedes hacer esto:

class A { var b = 5 } let a = A() a.b = 6


Podrías recorrer la matriz con un índice

for index in 0..<statuses.count { // Use your array - statuses[index] }

que debería funcionar sin obtener "no se puede asignar"


Si ''Y'' en este caso es un protocolo, subclase su protocolo a class . Tuve un protocolo:

protocol PlayerMediatorElementProtocol { var playerMediator:PlayerMediator { get } }

e intenté configurar playerMediator desde dentro de mi mediador jugador:

element.playerMediator = self

Lo que se convirtió en el error cannot asign ''playerMediator'' in ''element''

Cambiar mi protocolo para heredar de la clase solucionó este problema:

protocol PlayerMediatorElementProtocol : class { var playerMediator:PlayerMediator { get } }

¿Por qué debería heredar de la clase?

La razón por la que debería heredar de la class es porque el compilador no sabe de qué tipo es heredado su protocolo. Structs también podría heredar este protocolo y no se puede asignar a una propiedad de una estructura constante .


Tu conjetura es cierta.

Al acceder a blockStatus , está creando una copia, en este caso, es una copia constante (los iteradores son siempre constantes).

Esto es similar a lo siguiente:

var numbers = [1, 2, 3] for i in numbers { i = 10 //cannot assign here }

Referencias:

Flujo de control

En el ejemplo anterior, el índice es una constante cuyo valor se establece automáticamente al comienzo de cada iteración del bucle.

Clases y Estructuras

Un tipo de valor es un tipo que se copia cuando se asigna a una variable o constante, o cuando se pasa a una función. [...] Todas las estructuras y enumeraciones son tipos de valor en Swift

Methods

Las estructuras y las enumeraciones son tipos de valor. De forma predeterminada, las propiedades de un tipo de valor no se pueden modificar desde sus métodos de instancia.

Sin embargo, si necesita modificar las propiedades de su estructura o enumeración dentro de un método particular, puede optar por mutar el comportamiento de ese método. Luego, el método puede mutar (es decir, cambiar) sus propiedades desde dentro del método, y cualquier cambio que realice se vuelve a escribir en la estructura original cuando finaliza el método. El método también puede asignar una instancia completamente nueva a su propia propiedad implícita, y esta nueva instancia reemplazará a la existente cuando finalice el método.

Puede participar en este comportamiento colocando la palabra clave de mutación antes de la palabra clave func para ese método: