willset lazy did swift

did - lazy var swift



Cambie el valor que se está configurando en el bloque willSet de la variable (2)

Estoy intentando ordenar la matriz que se está configurando antes de establecerla, pero el argumento de willSet es inmutable y la sort muta el valor. ¿Cómo puedo superar este límite?

var files:[File]! = [File]() { willSet(newFiles) { newFiles.sort { (a:File, b:File) -> Bool in return a.created_at > b.created_at } } }

Para poner esta pregunta fuera de mi propio contexto de proyecto, hice esta idea:

class Person { var name:String! var age:Int! init(name:String, age:Int) { self.name = name self.age = age } } let scott = Person(name: "Scott", age: 28) let will = Person(name: "Will", age: 27) let john = Person(name: "John", age: 32) let noah = Person(name: "Noah", age: 15) var sample = [scott,will,john,noah] var people:[Person] = [Person]() { willSet(newPeople) { newPeople.sort({ (a:Person, b:Person) -> Bool in return a.age > b.age }) } } people = sample people[0]

Recibo el error que indica que newPeople no es mutable y que la sort está intentando mutarlo.


No es posible cambiar los tipos de valor (incluidas las matrices) antes de que se establezcan dentro de willSet . En su lugar, deberá usar una propiedad computada y un almacenamiento de respaldo como:

var _people = [Person]() var people: [Person] { get { return _people } set(newPeople) { _people = newPeople.sorted { $0.age > $1.age } } }


No es posible mutar el valor dentro de willSet . Si implementa un observador willSet , se pasa el nuevo valor de propiedad como un parámetro constante.

¿Qué hay de modificarlo para usar didSet ?

var people:[Person] = [Person]() { didSet { people.sort({ (a:Person, b:Person) -> Bool in return a.age > b.age }) } }

willSet se llama justo antes de que se almacene el valor.
didSet se llama inmediatamente después de que se almacena el nuevo valor.

Puede leer más sobre los observadores de propiedades aquí https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html

También puede escribir un getter y setter personalizado como a continuación. Pero didSet parece más conveniente.

var _people = [Person]() var people: [Person] { get { return _people } set(newPeople) { _people = newPeople.sorted({ (a:Person, b:Person) -> Bool in return a.age > b.age }) } }