gpt4 book ai didi

iphone - Objective-C 自定义 Getter/Setter

转载 作者:搜寻专家 更新时间:2023-10-30 19:50:48 24 4
gpt4 key购买 nike

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

@interface Portion :  NSManagedObject  
{
}

@property (nonatomic, retain) NSNumber * volume;

我想创建一个自定义的 getter/setter 来根据用户设置的内容在 ml/oz 之间进行转换,这样数据库总是存储相同的值,并且它会自动转换为首选单位。我最近的尝试是这样的:

#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 Model-View-Controller Design Pattern )。为什么不使用在 View 级别更有效的格式化程序来帮助将原始 NSNumber 值格式化为将呈现给用户的字符串?

然后您将拥有一个可重用的类,您可以在任何使用代表体积的数字值的地方使用它。格式化程序将存储一个“unitsType”值,以便它知道如何正确格式化传入的数字。

我使用我现有的格式化程序之一 MDFileSizeFormatter 作为起点做了一个快速版本:

#import <Foundation/Foundation.h>

enum {
MDVolumeFormatterMetricUnitsType = 1,
MDVolumeFormatterOurStupidAmericanUnitsType = 2,
MDVolumeFormatterDefaultUnitsType = MDVolumeFormatterMetricUnitsType
};

typedef NSUInteger MDVolumeFormatterUnitsType;


@interface MDVolumeFormatter : NSFormatter {
MDVolumeFormatterUnitsType unitsType;
NSNumberFormatter *numberFormatter;
}
- (id)initWithUnitsType:(MDVolumeFormatterUnitsType)aUnitsType;

@property (assign) MDVolumeFormatterUnitsType unitsType;

@end

然后是.m文件:

#import "MDVolumeFormatter.h"

#define MILLILITERS_PER_OUNCE 29.5735296

@implementation MDVolumeFormatter

@synthesize unitsType;

- (id)init {
return [self initWithUnitsType:MDVolumeFormatterDefaultUnitsType];
}

- (id)initWithUnitsType:(MDVolumeFormatterUnitsType)aUnitsType {
if (self = [super init]) {
numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setFormat:@"#,###.#"];
[self setUnitsType:aUnitsType];
}
return self;
}

- (void)dealloc {
[numberFormatter release];
[super dealloc];
}

- (NSString *)stringForObjectValue:(id)anObject {
if ([anObject isKindOfClass:[NSNumber class]]) {
NSString *string = nil;
if (unitsType == MDVolumeFormatterMetricUnitsType) {
string = [[numberFormatter stringForObjectValue:
[NSNumber numberWithFloat:
[(NSNumber *)anObject floatValue] * MILLILITERS_PER_OUNCE]]
stringByAppendingString:@" mL"];

} else {
string = [[numberFormatter stringForObjectValue:anObject] stringByAppendingString:@" oz"];
}
return string;
}
return nil;
}

@end

这可能会扩展为对传入值进行测试并自动确定适当的体积单位。例如,如果 floatValue 为 16.0,您可以使用 if then 逻辑返回一串“2.0 杯”而不是 16 盎司。

关于iphone - Objective-C 自定义 Getter/Setter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4141189/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com