Notei que o compilador não me permite substituir uma propriedade armazenada por outro valor armazenado (o que parece estranho):
class Jedi {
var lightSaberColor = "Blue"
}
class Sith: Jedi {
override var lightSaberColor = "Red" // Cannot override with a stored property lightSaberColor
}
No entanto, estou autorizado a fazer isso com uma propriedade computada:
class Jedi {
let lightSaberColor = "Blue"
}
class Sith: Jedi {
override var lightSaberColor : String{return "Red"}
}
Por que não estou autorizado a atribuir outro valor?
Por que substituir uma propriedade armazenada é uma abominação e fazê-lo com um kosher calculado? O que eles estão pensando?
inheritance
swift
properties
overriding
cfischer
fonte
fonte
Respostas:
Você definitivamente pode atribuir um valor diferente a uma propriedade herdada. Você pode fazer isso se inicializar a propriedade em um construtor que aceita esse valor inicial e transmitir um valor diferente da classe derivada:
Substituir uma propriedade não é o mesmo que atribuir um novo valor - é mais como atribuir uma classe a uma propriedade diferente. De fato, é isso que acontece quando você substitui uma propriedade calculada: o código que calcula a propriedade na classe base é substituído pelo código que calcula a substituição dessa propriedade na classe derivada.
Além dos observadores, as propriedades armazenadas não têm comportamento; portanto, não há realmente nada a substituir. É possível fornecer um valor diferente à propriedade através do mecanismo descrito acima. Isso faz exatamente o que o exemplo da pergunta está tentando obter, com uma sintaxe diferente.
fonte
Para mim, seu exemplo não funciona no Swift 3.0.1.
Entrei no playground esse código:
Lança erro no momento da compilação no Xcode:
Não, você não pode alterar o tipo de propriedade armazenada. O Princípio de Substituição de Liskov obriga a permitir que uma subclasse seja usada em um local onde a superclasse é desejada.
Mas se você mudar para
var
e, portanto, adicionar oset
na propriedade computada, poderá substituir a propriedade armazenada por uma propriedade calculada do mesmo tipo.Isso é possível porque pode fazer sentido alternar da propriedade armazenada para a propriedade calculada.
Mas substitua um
var
propriedade por umavar
propriedade armazenada não faz sentido, porque você só pode alterar o valor da propriedade.No entanto, você não pode substituir uma propriedade armazenada por uma propriedade armazenada.
Eu não diria que os Sith são Jedi :-P. Portanto, é claro que isso não pode funcionar.
fonte
fonte
Você provavelmente deseja atribuir outro valor à propriedade:
fonte
Para o Swift 4, da documentação da Apple :
fonte
Infelizmente, no Swift, isso não é possível. A melhor alternativa é a seguinte:
fonte
Eu tive o mesmo problema para definir uma constante para um controlador de exibição.
Como estou usando o construtor de interface para gerenciar a exibição, não posso usá-la
init()
, portanto, minha solução alternativa foi semelhante a outras respostas, exceto pelo uso de uma variável computada somente leitura nas classes base e herdada.fonte
Se você tentar fazer isso no Swift 5, será recebido por um
Sua melhor aposta é declará-lo como uma propriedade computada.
Isso funciona, pois estamos substituindo a
get {}
funçãofonte
Swift não permite substituir uma variável.
stored property
Em vez disso, você pode usarcomputed property
É mais claro quando comparado com Java, onde um campo de classe não pode ser substituído e não suporta polimorfismo porque é definido em tempo de compilação (executado com eficiência). É chamado de variável oculta [Sobre] Não é recomendável usar esta técnica porque é difícil de ler / dar suporte
[Propriedade rápida]
fonte
Você também pode usar uma função para substituir. Não é uma resposta direta, mas pode enriquecer este tópico)
Classe A
Classe B: A
fonte