Objective-C:自定义BOOL访问器(getter和setter)方法



我知道有人已经问过写BOOL变量的getter和setter。但是,如果我定义一个自定义getter &设置方法setImmediate &分别是isImmediate,我希望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工作?

你需要像

@property (nonatomic, getter=isImmediate) BOOL immediate;
.h文件中的

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

在@interface:

中声明这个属性
@interface PasscodeLock : NSObject {
}
@property(dynamic, getter=isImmediate,
                   setter=setImmediate:) BOOL immediate;
// etc.
@end

(setter=部分是可选的)

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

foo.immediate
在您的代码

中,假定getter和setter分别命名为-immediate-setImmediate:。你的getter命名不正确。最好的方法是声明一个属性,正如Mark和Kenny已经说过的,但是你也可以改变getter的名字。

关键是你不需要声明属性来使用点语法,但是如果你打算使用点语法,那么声明属性是声明getter和setter的推荐方式。

最新更新