我有一个符合协议的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
这种方法是否有任何问题,或者可以以任何方式改进?
以下情况如何?
该属性不是delegate
,而是colorPalette
或fontFamilies
,需要默认值。
协议中的所有内容都是@required
。
在运行时,可以将属性的值设置为其他值(符合协议的另一个类的实例)。
我正在尝试封装(默认)行为。
考虑到有3个符合协议的类 - 最初我可能想要使用第一个中的所有值。明天我可能会选择第二个是更好的默认值。另外,用户可以在运行时设置可以使用3中的任何一个的偏好。
答案 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