我该如何为委托设置默认值?

时间:2014-04-03 03:25:28

标签: objective-c automatic-ref-counting delegation

我有一个符合协议的delegate属性的类:

MyClass.h

@interface MyClass : NSObject

@property (nonatomic, weak) id<MyProtocol> delegate;

@end

我想为delegate属性设置一个默认值,就像UITableViewController一样。

请考虑以下事项:

MyClass.m

@interface MyClass ()

@property (nonatomic, strong) id<MyProtocol> defaultDelegate;

@end


@implementation MyClass

- (instancetype)init
{
    self = [super init];

    if (self) {
        _defaultDelegate = // something conforming to MyProtocol
        _delegate = _defaultDelegate;
    }

    return self;
}

@end

这种方法是否有任何问题,或者可以以任何方式改进?


更新#1

以下情况如何?

该属性不是delegate,而是colorPalettefontFamilies,需要默认值。

协议中的所有内容都是@required

在运行时,可以将属性的值设置为其他值(符合协议的另一个类的实例)。


更新#2

我正在尝试封装(默认)行为。

考虑到有3个符合协议的类 - 最初我可能想要使用第一个中的所有值。明天我可能会选择第二个是更好的默认值。另外,用户可以在运行时设置可以使用3中的任何一个的偏好。

4 个答案:

答案 0 :(得分:1)

默认值应为nil。没有理由给它一个价值。当所有其他类都使用它时,预期的行为是需要完全实现委托。当您开始添加默认值时,您将击败整点。

答案 1 :(得分:0)

默认情况下,您的代理人应为零。但是,要实现UITableView之类的默认值,您的类应检查委托是否使用respondsToSelector:响应每个可选的委托方法(如果委托为nil,则它将返回false)。如果代理没有响应,则使用默认值。您无需设置“默认委托”即可。

您的代码看起来像这样:

NSString *stringValue = nil;
if ([self.delegate respondsToSelector:@selector(getStringValue)]) {
     stringValue = [self.delegate getStringValue];
}
else {
    stringValue = @"Default value";
}

答案 2 :(得分:0)

您可能正在寻找这种实施方式:

if (delegate == nil) {
    // default behavior
} else {
    [delegate methodToCallWithParameters:...];
}

如果您的财产必须实施协议,那就是类似的问题。

答案 3 :(得分:0)

根据回复的组合,听起来我应该这样做:

@interface MyClass ()

@property (nonatomic, strong) id<MyProtocol> currentColorPalette;
@property (nonatomic, strong) id<MyProtocol> defaultColorPalette;

@end


@implementation MyClass

- (instancetype)init
{
    self = [super init];

    if (self) {
        _defaultColorPalette = [[SomeClassConformingToProtocol alloc] init];
    }

    return self;
}

- (void)setColorPalette:(id<MyProtocol>)colorPalette
{
    _colorPalette = colorPalette;
    _currentColorPalette = _colorPalette;
}

- (id<MyProtocol>)currentColorPalette
{
    id<MyProtocol> colorPalette = nil;

    if (self.currentColorPalette == nil) {
        colorPalette = self.defaultColorPalette;
    }
    else {
        colorPalette = self.currentColorPalette;
    }

    return colorPalette;
}


#pragma mark - MyProtocol

- (void)doSomethingWithCurrentColorPalette
{
    [self.currentColorPalette someDelegateMethod];
}

@end