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.
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
})
}
}