Свойства - от C # до Objective C - PullRequest
0 голосов
/ 10 октября 2011

Кто-нибудь знает целевой эквивалент c функциональности get set в c #?

Вот пример того, из чего я хочу преобразовать:

 public double pBal 
        { 
            get
             { 
                return balance; //pBal;
             } 
            set 
            { 
                balance = value;
             } 
        } 

Ответы [ 3 ]

1 голос
/ 10 октября 2011

В Objective-C геттеры и сеттеры вместе называются «аксессорами».Вам не нужно определять методы доступа для простых свойств.Определение свойства заставит компилятор генерировать методы доступа.Для более сложных свойств геттеры - это нулевые методы с обычно тем же именем, что и у свойства, а сеттеры - это унарные методы с добавлением «set» к имени.

Ваш пример будет реализован вручную как:

-(double)pBal {
    return balance;
}
-(void)setPBal:(double)newBalance {
    balance = newBalance;
}

Это эквивалентно тому, что генерируется:

@property (nonatomic,assign) double pBal;
...
@synthesize pBal=balance;

Настраиваемые средства доступа

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

@property (retain) NSString* name;
...
@synthesize name;

будет генерировать средства доступа, подобные:

-(NSString*)name {
    @synchronized(name) {
        return [[name retain] autorelease];
    }
}
-(void)name:(NSString*)aString {
    @synchronized(name) {
        if (name != aString) {
            [name release];
            name = [aString retain];
        }
    }
}

. Фактические средства доступа могут использовать блокировки, а не блоки @synchronized, что может повлиять на рекурсивные свойства и исключения..

Средства доступа к именам

Правила именования по умолчанию для средств доступа исходят из кодирование значения ключа .Булевозначные геттеры обычно используют «is» в качестве префикса.Обратите внимание, что в этом отношении нет ничего особенного в логических значениях - ни язык, ни компилятор не заставляют методы "is ..." возвращать BOOL - это просто вопрос соглашения.

-(BOOL)isReady {
    return ready;
}
-(void)setReady:(BOOL)aBool {
    ready = aBool;
}

Вы можете переопределить имена доступа по умолчанию с использованием атрибутов "getter" и "setter" в объявлении свойства.

@property (getter=dateAsString) NSString *displayDate;
1 голос
/ 10 октября 2011

http://en.wikipedia.org/wiki/Objective-C#Properties

Пример заголовка

@interface Person : NSObject {
    @public
        NSString *name;
    @private
        int age;
}

@property(copy) NSString *name;
@property(readonly) int age;

-(id)initWithAge:(int)age;
@end

Пример класса

@implementation Person
@synthesize name;

-(id)initWithAge:(int)initAge {
    age = initAge; // NOTE: direct instance variable assignment, not property setter
    return self;
}

-(int)age {
    return age; // wiki had 29 here, not sure why. Edited to return age. 
}
@end

Может быть, стоит изучить, как Objective-C управляет памятью, даже с автоматическим подсчетом ссылок на горизонте.

0 голосов
/ 10 октября 2011

Не совсем так, что вам нужно создать метод для получения и настройки.C # предоставляет этот метод в качестве ярлыка.

Интерфейс

@interface SimpleCar : NSObject {
    NSString* make;
    NSString* model;
    NSNumber* vin;
}

// set methods
- (void) setVin:   (NSNumber*)newVin;
- (void) setMake:  (NSString*)newMake;
- (void) setModel: (NSString*)setModel;

// convenience method
- (void) setMake: (NSString*)newMake
        andModel: (NSString*)newModel;

@end

И Реализация

@implementation SimpleCar

// set methods
- (void) setVin: (NSNumber*)newVin {
    [vin release];
    vin = [[NSNumber alloc] init];
    vin = newVin;
}

- (void) setMake: (NSString*)newMake {
    [make release];
    make = [[NSString alloc] initWithString:newMake];
}

- (void) setModel: (NSString*)newModel {
    [model release];
    model = [[NSString alloc] initWithString:newModel];
}

// convenience method
- (void) setMake: (NSString*)newMake
        andModel: (NSString*)newModel {
    // Reuse our methods from earlier
    [self setMake:newMake];
    [self setModel:newModel];
}

// get methods
- (NSString*) make {
    return make;
}

- (NSString*) model {
    return model;
}

- (NSNumber*) vin {
    return vin;
}

@end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...