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

Posted

技术标签:

【中文标题】如何在 iOS 7 中执行动态/计算属性【英文标题】:How to do a dynamic/computed property in iOS 7 【发布时间】:2014-02-21 19:37:32 【问题描述】:

刚开始使用 ios 7 进行 iPhone 编程,我发现很难掌握简单的属性。当人们发现关于它们的文档(官方或其他)时,很难辨别什么是相关的,什么不再相关,因为在最近的几个版本中事情已经发生了变化。

我得到了基本模式,例如

@property (strong, nonatomic) NSString *name;

我知道如果我想直接访问,我应该参考 _name,但是在完成了属性之后,我可以/应该做self.name,这将变成[self setName: ...][self name] 之类的东西我什至可以实现这些来产生副作用,并从中获得 KVO 行为。

我今天想冒险的新领域是拥有一个虚拟属性,这样我可以在访问/设置时使用点表示法,但我将定义访问/设置方法。更具体地说,我有一个具有以下“正常”属性的对象:

@property (strong, nonatomic) NSDate* started;
@property (strong, nonatomic) NSDate* paused;
@property (assign, nonatomic) BOOL repeat;

我想添加一个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;

- (void) setStatus: (NSDictionary*) doc 
    self.started = doc[@"started"];
    self.paused = doc[@"paused"];
    self.repeat = doc[@"repeat"] != nil;

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

【问题讨论】:

【参考方案1】:

只需添加

@property (strong, nonatomic) NSDictionary* status;

到界面。由于您已经为该属性实现了 setter 和 getter, 编译器没有创建任何访问器方法(并且没有支持实例变量 _status),然后调用你的方法。

【讨论】:

但我不想要/不需要任何与之相关的内存。我不需要/想要一个 _status ivar 神奇地出现。如果我按照你的建议做,这不会发生吗? @TravisGriggs:不(我只是将其添加到答案中)。如果实现了 both 访问器,则编译器不会为该属性创建任何 ivar。 那么是什么触发编译器添加支持变量呢?它如何辨别什么时候该做,什么时候不该做? @TravisGriggs:如果没有提供所有必需的访问器方法,编译器会创建 ivar。对于只读属性:如果没有提供 getter。对于读写属性:如果没有同时提供 getter 和 setter。 @TravisGriggs:如果您提供了所有必需的访问器方法,但想要支持 ivar,则可以使用 @synthesize prop = _prop;。 - @dynamic 没有任何改变。它表示访问器将在 运行时 提供(例如,Core Data 动态创建的访问器方法)。【参考方案2】:

为什么不添加一个property

@property NSMutableDictionary *status;

您可以认为property 声明等同于声明两个dot-accessor 方法。

关于dot notationmessage notation 的优点的讨论正在进行中。你可能想看看: Dot notation vs. message notation for declared properties

【讨论】:

这样做你隐式指定@property (assign, atomic)

以上是关于如何在 iOS 7 中执行动态/计算属性的主要内容,如果未能解决你的问题,请参考以下文章

iOS Swift4如何保护接口中定义的计算属性不被赋值?

如何将值绑定到类属性?

Vuejs:如何在创建的钩子中获取计算属性

在 Magento 中动态计算属性

我应该如何对我的核心数据实体中的 NSNumber 属性执行计算/更新?

typescript 计算属性允许您使用在运行时动态计算的名称在对象上定义属性。