Parâmetros esconder as variáveis ??de instância em Objective-C
-
12-09-2019 - |
Pergunta
Existe uma maneira de dar um parâmetro para um método o mesmo nome que uma variável de instância em Objective-C sem esconder essa variável?
Por exemplo,
- (void)doSomething:(id)object
{
self.object = object;
}
O código acima dá o aviso "Declaração local de couros 'objeto' variável de instância."
A solução óbvia é para citar os argumentos de parâmetro diferente, mas acho que é chato ter que escolher um nome como "anObject" em vez de "objeto".
Solução
Você pode usar a notação de ponto para propriedades de acesso (como você faz no exemplo), mas variáveis ??de instância têm apenas um caminho de acesso, então a única solução se você quiser o acesso tanto uma variável de instância e uma variável local é dar-lhes diferentes nomes.
Formalmente, isto está relacionado com as restrições sobre alfa conversão em cálculo lambda, especificamente, que a variável ligada deve permanecer ligado e uma variável livre permanecer livre.
Se você não gosta do "um" prefixo para os habitantes locais, você pode usar o "_" convenção de prefixo para as variáveis ??de instância, pois eles também são variáveis ??efetivamente protegidos.
@interface AClass {
id _object;
}
@property (retain) id object;
@end
@implementation AClass
@synthesize object = _object;
- (void)doSomething:(id)object
{
[_object befriend:object];
}
...
É claro, "_" lê como "meu", por isso pode ser tão desagradável como "a" / "um" antes parâmetros. A renomeação é a melhor solução como exemplo e locais variáveis ??têm diferentes papéis, e seus nomes devem refletir isso.
Outras dicas
Você pode ser capaz de fazer algo assim self->object = object
, mas a convenção Objective-C (derivada do Smalltalk) é parâmetros de prefixo com "a" ou "um" se o parâmetro tem o mesmo nome como uma variável de instância.