Estoy agregando algo de azúcar sintáctico a mi aplicación y encontré una 'inconsistencia'. Probablemente haya una buena razón para ello, pero hay alguna forma de limpiar un poco la implementación. Estoy haciendo esto para proporcionar un solo lugar para establecer/obtener algunas propiedades.
enum MyType: String { case Unknown, First, Second var enabled: Bool { set { UserDefaults.standard.set(newValue, forKey: self.rawValue) } get { return UserDefaults.standard.bool(forKey: self.rawValue) } } }Ahora puedo usar los valores de enumeración para obtener los valores predeterminados
if MyType.First.enabled { ........ }Pero no puedo establecer directamente el valor:
MyType.First.enabled = trueprovoca 'no se puede establecer la propiedad, First no es asignable'
pero puedo salirme con la mía
var type = MyType.First type.enabled = true¿Hay una manera simple de usar el método de una línea?
El problema es que las enum son tipos de valor, por lo que cuando llama al setter de MyType.First enabled también muta First . Si no asigna tipos de valor a una variable mutable de forma explícita, se consideran inmutables. Por eso if MyType.First.enabled {...} no funciona, pero
var type = MyType.First type.enabled = truefunciona.
Si marca el setter como nonmutating , el problema se resuelve, ya que el compilador ahora sabrá que no está mutando un tipo de valor al llamar al setter en su propiedad.
enum MyType: String { case unknown, first, second var enabled: Bool { nonmutating set { UserDefaults.standard.set(newValue, forKey: self.rawValue) } get { return UserDefaults.standard.bool(forKey: self.rawValue) } } } PD: la convención de nomenclatura de Swift para los casos de enumeración es enum , ya que no son tipos en sí mismos y solo los tipos deben ser UpperCamelCase. He modificado su enum MyType consecuencia.
Al agregar la palabra clave nonmutating al método set , le está diciendo al compilador que el método set no modificará el tipo adjunto, que es la enumeración MyType en este caso.
enum MyType: String { case Unknown, First, Second var enabled: Bool { nonmutating set { UserDefaults.standard.set(newValue, forKey: self.rawValue) } get { return UserDefaults.standard.bool(forKey: self.rawValue) } } }