Como faço para sobrescrever o setter da propriedade armazenada no Swift?
No Obj-C, posso sobrescrever seu setter, mas o Swift não parece estar feliz com getter / setters sendo usados para propriedade armazenada.
Digamos que eu tenha uma Card
classe com uma propriedade chamada rank
. Não quero que o cliente dê a ele nenhum valor inválido, portanto, no objetivo-C, posso sobrescrever setRank
para que ele execute uma verificação adicional. Mas willSet
em Swift não parece ajudar porque newValue
é constante e não faz sentido atribuir rank
porque setter será chamado em um loop.
Respostas:
Está bem. Lendo a documentação da Apple no Swift, descobri o seguinte :
Então, tudo que você precisa fazer é o seguinte:
fonte
var rankTimesTwo: Int { get { return rank * 2 } }
Você não pode substituir
get
/set
por uma propriedade armazenada, mas pode usar observadores de propriedadewillSet
/didSet
:Os nomes dos parâmetros padrão são
newValue
parawillSet
eoldValue
paradidSet
, ou você mesmo pode nomeá-los como emwillSet(newTotalSteps)
.fonte
Card
classe com uma propriedade chamadarank
. Não quero que o cliente atribua nenhum valor, portanto, no objetivo-C, posso sobrescreversetRank
para que ele execute uma verificação adicional. MaswillSet
em Swift não parece ajudar porquenewValue
é constante e não faz sentido atribuirrank
porque setter será chamado em um loop.didSet
para verificarrank
depois de ser definido e se falhar na validação, redefina-o para outra coisa, por exemplooldValue
?get e set são para propriedades computadas (eles não têm nenhum armazenamento de apoio). (Na minha opinião, a palavra-chave 'var' é confusa aqui)
fonte
Se você não quiser usar didSet, que apresenta o problema de o valor da propriedade estar temporariamente errado, você deve envolver uma propriedade computada em torno dele.
Ou:
fonte
foo
é apenas uma expressão calculada de_foo
, não se deixe enganar pela palavra-chave "var"! Isso significa que há duas entradas acessíveis a partir do namespace privado, mas isso não tem relação com protected / public e mantém o valor defoo
válido em todos os momentos. Este é essencialmente o padrão de "visualização". O problema que você obtém com a reescrita viadidSet
, além de ter um período de invalidação, é que há um potencial significativo para um loop infinito, já que você está reinserindo odidSet
manipulador por dentrodidSet
.Exemplo simplificado:
Exemplo completo
Confira
perimeter
neste exemplo.Trecho de: Apple Inc. “The Swift Programming Language”. iBooks. https://itun.es/us/jEUH0.l
fonte
perimeter
ainda é uma propriedade computada. Como sobrescrevo sideLength sem introduzir uma propriedade computada?get
eset