【问题标题】:Objective-C: Custom BOOL accessor (getter & setter) methodsObjective-C:自定义 BOOL 访问器(getter & setter)方法
【发布时间】:2011-05-03 15:36:53
【问题描述】:

我知道有人已经询问过Writing getter and setter for BOOL variable。但是,如果我分别定义自定义 getter 和 setter 方法 setImmediateisImmediate,我希望 passcode.immediate = NO 也可以工作。

我没有任何实例变量,但也许我应该?我可以为NSDate *lastUnlocked 添加一个。

这是目前为止的相关代码:

// PasscodeLock.h

extern NSString *const kPasscodeLastUnlocked;

@interface PasscodeLock : NSObject {

}

- (BOOL)isImmediate;
- (void)setImmediate:(BOOL)on;

- (NSDate *)lastUnlocked;
- (void)resetLastUnlocked;
- (void)setLastUnlocked:(NSDate *)lastUnlocked;

@end


// PasscodeLock.m

#import "PasscodeLock.h"

NSString *const kPasscodeLastUnlocked    = @"kPasscodeLastUnlocked";

@implementation PasscodeLock

#pragma mark PasscodeLock

- (BOOL)isImmediate {
    return self.lastUnlocked == nil;
}

- (void)setImmediate:(BOOL)on {
    if (on) {
        [self resetLastUnlocked];
    } else {
        self.lastUnlocked = nil;        
    }
}

- (NSDate *)lastUnlocked {
    return [[NSUserDefaults standardUserDefaults] objectForKey:kPasscodeLastUnlocked];
}

- (void)resetLastUnlocked {
    NSDate *now = [[NSDate alloc] init];
    self.lastUnlocked = now;
    [now release];
}

- (void)setLastUnlocked:(NSDate *)lastUnlocked {
    [[NSUserDefaults standardUserDefaults] setObject:lastUnlocked forKey:kPasscodeLastUnlocked];
}

然后,在以PasswordLock *passwordLock 作为实例变量的视图控制器中,我想做passcode.immediate = NO,但我收到错误“在'PasscodeLock *' 类型的对象上找不到属性'立即'。”

如何让passcode.immediate = NO 工作?

【问题讨论】:

  • 为什么你的-lastUnlocked 返回一个NSString 而-setLastUnlocked: 接受一个NSDate?

标签: objective-c custom-attributes boolean accessor


【解决方案1】:

你需要类似的东西

@property (nonatomic, getter=isImmediate) BOOL immediate;

在您的 .h 文件中,当然还有在您的 .m 文件中的 @synthesize 语句。这将创建属性并定义您的 getter 方法名称。

【讨论】:

  • 分配属性的非原子部分是多余的。
【解决方案2】:

在@interface 中声明这样的属性:

@interface PasscodeLock : NSObject {

}
@property(dynamic, getter=isImmediate,
                   setter=setImmediate:) BOOL immediate;
// etc.
@end

setter= 部分是可选的)

【讨论】:

    【解决方案3】:

    我认为问题在于您的 getter 和 setter 名称不一致。默认情况下,如果您有

    foo.immediate
    

    在您的代码中,it is assumed 将 getter 和 setter 分别命名为 -immediate-setImmediate:。您的吸气剂名称不正确。 最好的方法是像 Mark 和 Kenny 所说的那样声明一个属性,但是你可以也改变你的 getter 的名字。

    重点是您不需要声明属性来使用点语法,但是如果您要使用点语法,那么声明属性是声明 getter 和 setter 的推荐方式。 p>

    【讨论】:

    • 谢谢。我刚刚将 getter 的名称从 -isImmediate 更改为 -immediate
    猜你喜欢
    • 2012-11-17
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    • 2017-08-23
    相关资源
    最近更新 更多