Ссылка на @dynamic accessor не компилируется - PullRequest
0 голосов
/ 16 апреля 2011

Это мое первое использование ключевого слова @dynamic. Я пытаюсь использовать основные данные. У меня есть класс, ссылающийся на объект типа NSManagedObject. Объект типа NSManagedObject был автоматически создан XCode из существующего основного объекта данных, который я настроил.

Код не скомпилируется из-за ошибки в начале строки «Client.FirstName». См. Примечание в комментарии к этой строке.

Поскольку ссылка на динамический метод доступа, я удивлен, что компилятор пометил бы это как неправильную ссылку. Это выглядит довольно просто, но я явно что-то упускаю. Я не уверен, что не так.

Код такой:

aTestClass.h

#import <Foundation/Foundation.h>    

@interface aTestClass : NSObject {

}

- (void) foo;

@end

aTestClass.m

#import "aTestClass.h"
#import "Client.h"

@implementation aTestClass

- (void) foo {
    Client.FirstName = @"CompilerFail";  // Fails here: Property 'FirstName' not found in object of type 'Client'
}

@end

и клиентские коды - это NSManagedObject, автоматически генерируемый XCode 4.

client.h

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>


@interface Client : NSManagedObject {
//@private
}
@property (nonatomic, retain) NSString * FirstName;
@property (nonatomic, retain) NSString * LastName;
@property (nonatomic, retain) NSString * Company;
@property (nonatomic, retain) NSSet* Jobs;

@end

Client.m

#import "Client.h"

@implementation Client
@dynamic FirstName;
@dynamic LastName;
@dynamic Company;
@dynamic Jobs;

- (void)addJobsObject:(NSManagedObject *)value {    
    NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value count:1];
    [self willChangeValueForKey:@"Jobs" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
    [[self primitiveValueForKey:@"Jobs"] addObject:value];
    [self didChangeValueForKey:@"Jobs" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
    [changedObjects release];
}

- (void)removeJobsObject:(NSManagedObject *)value {
    NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value count:1];
    [self willChangeValueForKey:@"Jobs" withSetMutation:NSKeyValueMinusSetMutation usingObjects:changedObjects];
    [[self primitiveValueForKey:@"Jobs"] removeObject:value];
    [self didChangeValueForKey:@"Jobs" withSetMutation:NSKeyValueMinusSetMutation usingObjects:changedObjects];
    [changedObjects release];
}

- (void)addJobs:(NSSet *)value {    
    [self willChangeValueForKey:@"Jobs" withSetMutation:NSKeyValueUnionSetMutation usingObjects:value];
    [[self primitiveValueForKey:@"Jobs"] unionSet:value];
    [self didChangeValueForKey:@"Jobs" withSetMutation:NSKeyValueUnionSetMutation usingObjects:value];
}

- (void)removeJobs:(NSSet *)value {
    [self willChangeValueForKey:@"Jobs" withSetMutation:NSKeyValueMinusSetMutation usingObjects:value];
    [[self primitiveValueForKey:@"Jobs"] minusSet:value];
    [self didChangeValueForKey:@"Jobs" withSetMutation:NSKeyValueMinusSetMutation usingObjects:value];
}

@end

1 Ответ

2 голосов
/ 16 апреля 2011

Это полный код?

Client.FirstName = @ "CompilerFail";

Client как в "классе с именем Client"? Или Client экземпляр класса Client?

Вот почему переменные экземпляра не должны начинаться с заглавной буквы. Это сбивает с толку.

Ваш код, вероятно, должен быть примерно таким.

Client *someClient = ...
someClient.firstName = @"Foo";

Вы можете точно увидеть, что такое класс и что такое переменная или свойство.

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