繁体   English   中英

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

[英]Objective-C: Custom BOOL accessor (getter & setter) methods

我知道有人已经问过有关为 BOOL 变量编写 getter 和 setter 的问题 但是,如果我分别定义自定义 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作为实例变量的视图 controller 中,我想做passcode.immediate = NO ,但我收到错误“在 object of type 'PasscodeLock *' 上找不到属性 'immediate'。”

如何让passcode.immediate = NO工作?

你需要类似的东西

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

在 your.h 文件中,当然还有在 your.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: 您的吸气剂名称不正确。 解决这个问题的最好方法是像 Mark 和 Kenny 所说的那样声明一个属性,但您可以更改 getter 的名称。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM