相关疑难解决方法(0)

非正式协议在Objective-C?

我想知道是否有人可以解释Objective C中的非正式协议?我尝试在苹果文档和其他一些书籍上理解它,但我的头仍在旋转,所以如果有人可以用例子来解释,我将非常感激.

谢谢.

objective-c

51
推荐指数
4
解决办法
2万
查看次数

在Objective-C中定义协议的类别?

在Objective-C中,我可以向具有类别的现有类添加方法,例如

@interface NSString (MyCategory)
- (BOOL) startsWith: (NSString*) prefix;
@end
Run Code Online (Sandbox Code Playgroud)

是否也可以使用协议来执行此操作,即如果存在NSString协议,则类似于:

@interface <NSString> (MyCategory)
- (BOOL) startsWith: (NSString*) prefix;
@end
Run Code Online (Sandbox Code Playgroud)

我想这样做,因为我对NSObject(该类)有几个扩展,只使用公共NSObject方法,我希望这些扩展也能用于实现协议的对象.

再举一个例子,如果我想编写一个方法logDescription,将对象的描述打印到日志中,该怎么办:

- (void) logDescription {
    NSLog(@"%@", [self description]);
}
Run Code Online (Sandbox Code Playgroud)

我当然可以将此方法添加到NSObject,但是还有其他类不从NSObject继承,我也想要使用此方法,例如NSProxy.由于该方法仅使用协议的公共成员,因此最好将其添加到协议中.

编辑:Java 8现在在接口中使用"虚拟扩展方法":http://cr.openjdk.java.net/~briangoetz/lambda/Defender%20Methods%20v4.pdf.这正是我想在Objective-C中做的事情.我没有看到这个问题引起如此多的关注......

此致,Jochen

protocols objective-c categories

38
推荐指数
4
解决办法
2万
查看次数

如何为Objective-C协议提供默认实现?

我想指定一个带有可选例程的Objective-C协议.当例程没有由符合协议的类实现时,我想在其位置使用默认实现.协议本身是否存在我可以定义此默认实现的位置?如果没有,减少复制和粘贴此默认实现的最佳做法是什么?

protocols objective-c standards-compliance default-implementation overhead-minimization

22
推荐指数
2
解决办法
1万
查看次数

为在Objective-C中实现特定协议的类创建类别?

简短的问题描述

我可以使用类别扩展UIView,但是它只适用于实现特定协议(WritableView)的子类吗?

即我可以做以下的事情吗?

@interface UIView<WritableView> (foo) // SYNTAX ERROR
- (void)setTextToDomainOfUrl:(NSString *)text;
- (void)setTextToIntegerValue:(NSInteger)value;
- (void)setCapitalizedText:(NSString *)text;
@end
@implementation UIView<WritableView> (foo)
// implementation of 3 above methods would go here
@end
Run Code Online (Sandbox Code Playgroud)

详细的问题描述

想象一下,我想将以下类别函数添加到任何实例UILabel:

[label setTextToDomainOfUrl:@"http://google.com"];
Run Code Online (Sandbox Code Playgroud)

这只是设置UILabel的text属性google.com.

同样地,我希望能够在其他几个类上调用此函数:

[button setTextToDomainOfUrl:@"http://apple.com"]; // same as: [button setTitle:@"apple.com" forState:UIControlStateNormal];
[textField setTextToDomainOfUrl:@"http://example.com"]; // same as: textField.text = @"example.com"
[tableViewCell setTextToDomainOfUrl:@"http://stackoverflow.com"]; // same as: tableViewCell.textLabel.text = @"stackoverflow.com"
Run Code Online (Sandbox Code Playgroud)

假设到目前为止我对我的设计非常满意,并且我希望为所有4个类增加2个方法:

[label setTextToIntegerValue:5] // same as: label.text = [NSString stringWithFormat:@"%d", 5]; …
Run Code Online (Sandbox Code Playgroud)

objective-c objective-c-category objective-c-protocol

7
推荐指数
1
解决办法
2157
查看次数

Objective-C协议的默认实现

setValue:forKeyPath:在Apple的NSKeyValueCoding协议文档中的方法讨论开始于:

这种方法的默认实现[...]

现在,这可能只是让我陷入了语义,但是:

  1. Objective-C协议如何具有默认实现
  2. 由于NSObject似乎不符合此协议,如何能够在自己的NSObject子类中利用此默认实现

cocoa protocols objective-c key-value-coding

3
推荐指数
1
解决办法
836
查看次数