Objective-C自定义Getter / Setter [英] Objective-C Custom Getter / Setter

查看:122
本文介绍了Objective-C自定义Getter / Setter的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用以下由Xcode自动生成的NSManagedObject:

I am using the following NSManagedObject which was automatically generated by Xcode:

@interface Portion :  NSManagedObject  
{
}

@property (nonatomic, retain) NSNumber * volume;

我想创建一个自定义getter / setter在ml / oz之间转换取决于用户已设置,那样数据库始终存储相同的值,它会自动转换为首选单位。我最近的尝试看起来像这样:

I would like to create a custom getter/setter to convert between ml/oz depending on what the user has set, that way the database always stores the same value and it is automatically converted to the preferred units. My latest attempt looks like this:

#import "Portion.h"
#import "SettingHandler.h"

#define MILLILITERS_PER_OUNCE 29.5735296

@implementation Portion 

@dynamic volume;

- (void) setVolume:(NSNumber *) number {
    if ([SettingHandler getUnitsTypeShort] == @"oz") {
        [self setValue:number forKey:@"volume"];
    } else {
        [self setValue:[NSNumber numberWithFloat:[number floatValue] * MILLILITERS_PER_OUNCE] forKey:@"volume"];
    }
}

- (NSNumber *) volume {
    if ([SettingHandler getUnitsTypeShort] == @"oz") {
        return [self valueForKey:@"volume"];
    } else {
        return [NSNumber numberWithDouble: [[self valueForKey:@"volume"] floatValue] * MILLILITERS_PER_OUNCE];
    }
}

setVolume调用最终调用自身, 。

The setVolume call ends up invoking itself causing an infinite loop. I'm guessing there is a way to do this but I don't know what it is, any ideas?

推荐答案

检查方法是否正确?出自定义属性和一对一关系访问器方法。基本上,你应该使用原始getter / setter方法访问/更改值,并用KVO通知包装这些调用。

Check out "Custom Attribute and To-One Relationship Accessor Methods" in the Core Data Programming Guide. Basically, you should use the primitive getter/setter methods to access/change the value and wrap those calls with KVO notifications.

您需要为原语访问器

@interface Portion (PrimitiveAccessors)
- (NSNumber *)primitiveVolume;
- (void)setPrimitiveVolume:(NSNumber *)number; 
@end

然后,您需要替换每次出现的:

Then you need to replace each occurrence of:

[self setValue:number forKey:@"volume"];

其中:

[self willChangeValueForKey:@"volume"];
[self setPrimitiveVolume:number];
[self didChangeValueForKey:@"volume"];

并在getter中进行相应的更改。

And make the corresponding changes in the getter.

这篇关于Objective-C自定义Getter / Setter的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆