Соглашения об именах сеттера / получателя Objective-C сводят меня с ума? - PullRequest
0 голосов
/ 05 ноября 2010

Я пытался что-то понять в течение нескольких часов, и я хотел бы узнать вашу точку зрения.

У меня есть setter / getter для одного из свойств моего класса (я заметил, что ДОЛЖЕН добавить «set» перед именем setter, иначе компилятор говорит, что нет setter):

@property (nonatomic, retain, readwrite, setter=setTopString:, getter=TopString) NSString* m_topString;

Когда я вызываю сеттер, как это, компилятор счастлив:

[secureKeyboardController setTopString:@"This action requires that your enter your authentication code."];

Но когда я пытаюсь использовать соглашение "точка", компилятор отклоняет меня:

                secureKeyboardController.topString = @"This action requires that your enter your authentication code.";

Что действительно странно, так это то, что соглашение об именовании точек работает с этим свойством:

@property (nonatomic, readwrite, getter=PINMaxLength, setter=setPINMaxLength:) NSInteger m_PINMaxLength;

В этом случае я могу сделать:

[secureKeyboardController setPINMaxLength:10];enter code here

или

secureKeyboardController.PINMaxLength = 10;

В обоих случаях компилятор доволен.

Я действительно хотел бы заснуть сегодня ночью, будучи менее глупым, чем сейчас. Таким образом, любое объяснение будет с благодарностью.

С уважением, Apple92

Ответы [ 3 ]

15 голосов
/ 06 ноября 2010

То, что вы делаете, объявляете свойства, как если бы вы объявляли переменные экземпляра.Вы не должны использовать имена в атрибутах getter и setter в объявлении @property с точечным синтаксисом;то, что оно работает сейчас, не является - насколько я знаю - намеренно.

Свойство должно быть тем, которое вы используете с точечным синтаксисом.Я думаю, что по какой-то причине - незнаком с соглашениями о кодировании Какао - вы назвали свои свойства m_topString и m_PINMaxLength.Это означает, что вы должны использовать их как someObject.m_topString и someObject.m_PINMaxLength.

Если вы хотите использовать эти имена для переменных экземпляра , которые вы решили использовать для поддержки свойствхранилище, вы должны объявить это в директиве @synthesize.

Вот как должен выглядеть ваш класс, чтобы он больше соответствовал обычным соглашениям о кодировании Какао и Objective-C:

@interface SomeClass : NSObject {
@private
    NSString *m_topString;
}
@property (nonatomic, readwrite, copy) NSString *topString;
- (id)initWithTopString:(NSString *)initialTopString;
@end

@implementation SomeClass
@synthesize topString = m_topString;
    // this says to use the instance variable m_topString
    // for the property topString's storage

- (id)initWithTopString:(NSString *)initialTopString {
    if ((self = [super init])) {
        m_topString = [initialTopString copy];
            // use the ivar directly in -init, not the property
    }
    return self;
}

- (void)dealloc {
    [m_topString release];
        // use the ivar directly in -dealloc, not the property

    [super dealloc];
}

- (NSString *)description {
    return [NSString stringWithFormat:@"SomeClass (%@)", self.topString];
        // elsewhere in your class, use the property
        // this will call through its getter and setter methods
}
@end
0 голосов
/ 28 июля 2014

Вы пытаетесь бороться с компилятором, и компилятор сопротивляется.

Вы пытаетесь объявить свойство с именем m_topString с помощью setter setTopString и getter TopString, и это явно глупо.Вы пишете код Objective-C, а не C ++.Ваш код будет кошмаром обслуживания (если только следующий сопровождающий не станет разумным и не изменит ваш код на соглашения Objective-C).

Сделайте одолжение, начните писать код Objective-C.Просто вызовите свойство topString, не выбирайте свои собственные имена для установщика и получателя, не выбирайте свои собственные имена для переменной экземпляра, и все работает просто отлично.

0 голосов
/ 05 ноября 2010

С заглавной буквы T в TopString, т.е. secureKeyboardController.TopString Я на 90% уверен, что это решит вашу проблему.

...