2016-09-03 4 views
2

Я недавно начал изучать obj-C, так что извините, если мне не хватает чего-то очевидного. Я хочу получить доступ к «passCode» (расширение) с помощью объекта clpPlayerStats, но это невозможно («Свойство не найдено на объекте ...»). Есть ли простой способ исправить это?Расширения класса Objective-C

clpPlayerStats.h

#import <Foundation/Foundation.h> 

@interface clpPlayerStats : NSObject 

@property(nonatomic, copy) NSString* name; 

@end 

clpPlayerStats.m

#import "clpPlayerStats.h" 

@interface clpPlayerStats() 

    @property (nonatomic) unsigned int passCode; 

@end 

@implementation clpPlayerStats 
@end 

main.m

#import <Foundation/Foundation.h> 
#import "clpPlayerStats.h" 

int main(int argc, const char * argv[]) { 
    @autoreleasepool { 
     clpPlayerStats *clapslock = [[clpPlayerStats alloc] init]; 
     NSString *username = [NSString stringWithFormat:@"xxxPussySlayerxxx"]; 
     clapslock.name = username; 
     clapslock.passCode = 12; // <------ "Property not found on object..." 
    } 
    return 0; 
} 

ответ

1

всегда должно начинаться со вторыми буквами.

Во-вторых, расширения класса удлиняют @interface класса. И, со всеми вещами C, независимо от того, можно ли объявить что-либо, полностью зависит от того, сможет ли компилятор видеть декларацию во время использования.

Итак, если вы хотите объявить что-то полу-частным, то обычно вы перемещаете расширение @interface ClpPlayerStats() в приватный заголовочный файл; ClpPlayerStats_Private.h. Затем, если вы хотите получить доступ к «частному» API, вы получите #import ClpPlayerStats_Private.h.

В Objective-C действительно нет официального понятия конфиденциальности. Просто видимость для компилятора.

+1

Я неправильно предположил, что могу добиться того же самого с расширением класса, как и с закрытым заголовком. Спасибо за подробное объяснение. –

2

С помощью этого кода:

@interface clpPlayerStats() 

    @property (nonatomic) unsigned int passCode; 

@end 

Вы объявляете частную собственность. Если вы хотите использовать passCode за рамками своего класса, вы должны добавить в открытом интерфейсе:

#import <Foundation/Foundation.h> 

@interface clpPlayerStats : NSObject 

    @property(nonatomic, copy) NSString* name; 
    @property (nonatomic) unsigned int passCode; 

@end 

и удалить интерфейс в названиях первого, класса .m

+0

В настоящее время я читаю «Objective-C Programming: The Big Nerd Ranch Guide», и автор говорит, что для создания расширения (идентичный случай) мне нужно добавить @interface в .m, а затем удалить свойство сформируйте заголовок. Есть ли способ доступа к passCode без добавления дополнительного свойства в .h? –

+0

@BartoszKunat Использует ли автор свойство вне класса с этим частным интерфейсом? –

+0

Это не «дополнительное свойство», которое у вас есть в .h * или * .m. Речь идет о области, которую вы хотите для свойства. – Paulw11

Смежные вопросы