如何在iOS 7中执行动态/计算属性

Tra*_*ggs 4 properties objective-c ios ios7 xcode5

刚刚开始使用iOS 7进行iPhone编程,我发现很难掌握这些简单的属性.很难看出什么是相关的,什么不再相关,因为人们发现了关于它们的文档(官方或其他),因为事情已经在最近几个版本中发展.

我得到了基本模式,例如

@property (strong, nonatomic) NSString *name;
Run Code Online (Sandbox Code Playgroud)

我知道我应该引用_name,如果我想直接访问,但已经完成了属性,我可以/应该这样做self.name,并且会变成像[self setName: ...]或者[self name]我甚至可以实现这些来创建副作用的东西,那个我从他们那里得到了KVO的行为.

我想进入今天的新领域是拥有虚拟属性,因此我可以在访问/设置时使用点表示法,但我将定义访问/设置方法.更具体地说,我有一个具有以下"普通"属性的对象:

@property (strong, nonatomic) NSDate* started;
@property (strong, nonatomic) NSDate* paused;
@property (assign, nonatomic) BOOL repeat;
Run Code Online (Sandbox Code Playgroud)

我想添加一个status属性,该属性将返回/分配NSDictionary从这些值派生的属性."方法"部分我得到了如何写:

- (NSMutableDictionary*) status {
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    if (self.started != nil)
        dict[@"started"] = self.started;
    if (self.paused != nil)
        dict[@"paused"] = self.paused;
    if (self.repeat)
        dict[@"repeat"] = @(YES);
    return dict;
}
Run Code Online (Sandbox Code Playgroud)

- (void) setStatus: (NSDictionary*) doc {
    self.started = doc[@"started"];
    self.paused = doc[@"paused"];
    self.repeat = doc[@"repeat"] != nil;
}
Run Code Online (Sandbox Code Playgroud)

我不知道的是,我添加了什么魔法酱,所以我可以使用self.statusself.status = @{}?在iOS 7/Xcode 5.我不需要这个虚拟/复合属性是KVO'able.

Mar*_*n R 15

只需添加

@property (strong, nonatomic) NSDictionary* status;
Run Code Online (Sandbox Code Playgroud)

到界面.由于您已为属性实现了setter和getter,因此编译器不创建任何访问器方法(并且没有后备实例变量 _status),并调用您的方法.

  • @TravisGriggs:如果未提供所有必需的访问器方法,编译器将创建ivar.对于只读属性:如果未提供getter.对于读写属性:如果不是,则同时提供getter和setter. (6认同)