Obj C内部for循环的内部协议,就像Java内部for循环的内部接口一样
我正在尝试在Objective C中执行类似的操作,这里有以下Java代码:Obj C内部for循环的内部协议,就像Java内部for循环的内部接口一样,java,objective-c,interface,protocols,Java,Objective C,Interface,Protocols,我正在尝试在Objective C中执行类似的操作,这里有以下Java代码: public interface Subscriber { Object register(); void unregister(); } public void registerDefaultSubscribers() { mDefaultEventSubscribers.clear; mDefaultEventSubscribers.addAll(createDefaultSubs
public interface Subscriber {
Object register();
void unregister();
}
public void registerDefaultSubscribers() {
mDefaultEventSubscribers.clear;
mDefaultEventSubscribers.addAll(createDefaultSubscribers());
for (Subscriber subscriber : mDefaultEventSubscribers)
registerSubscriber(subscriber);
}
这就是我在Objective-C中的想法
@protocol Subscriber <NSObject>
- (NSObject *)register;
- (void)unregister;
@end
# pragma registerSubscribers
- (void)registerDefaultSubscribers {
[_defaultNotificationSubscribers removeAllObjects];
[_defaultNotificationSubscribers addObjectsFromArray:[self createDefaultSubscribers]];
for (id<CLNotificationSubscriber> subscriber in _defaultNotificationSubscribers) {
[self registerSubscriber:subscriber];
}
}
这看起来正确吗?我在目标C中的做法有什么问题吗
- (NSObject *)register;
Objective-C类型是动态的。因此,如果没有针对所有返回值的公共基类,则使用id而不是NSObject。NSObject是一个可能的基类,而不是所有对象的基类
- (id)register;
也许您想向该类型添加一个协议
B
假设_defaultNotificationSubscribers是一个可变数组,我不知道为什么要更改现有实例而不是创建新实例。为什么不使用setter和getter来启用KVO
除此之外,create听起来像是一个执行创建并返回成功标志的方法。我称之为默认订户。是否创建它们是一个实施细节:
(void)registerDefaultSubscribers
{
self.defaultNotificationSubscribers = [self defaultSubscribers];
…
}
我正在尝试创建一个类注册表,这些类将作为NSNotificationCenter上的观察者。感谢您解释id和NSObject!这是正确的方法吗?在Objective C.HashMap中也可以有类似的东西吗?我正在考虑使用NSMapTable。我真的不知道,为什么要在通知中心上注册观察者,因为通知中心已经关心观察者了。这背后的想法是什么?这不是重新发明轮子,而是一台使轮子转动的机器!?已经有了。不,没有必要。1.Cocoa集合是按它们是什么进行分组的,而不是如何实现它们。在大多数情况下,字典是正确的选择。NSMapTable用于内存管理和其他一些细节。现在忘了它吧。2.您不能在源代码中键入集合,因为Objective-C是动态键入的。然而,也有类似的支持,但这是为了向静态类型Swift解释现代编程技术。如果你不使用Swift,因为你不想回到70年代早期,那么也不要再考虑它了。也许对来自Java的你来说,使用静态类型更安全。这是一种感觉,不是别的。
(void)registerDefaultSubscribers
{
self.defaultNotificationSubscribers = [self defaultSubscribers];
…
}