Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 类对象上的快速枚举_Objective C_Oop_Class_Foundation_Fast Enumeration - Fatal编程技术网

Objective c 类对象上的快速枚举

Objective c 类对象上的快速枚举,objective-c,oop,class,foundation,fast-enumeration,Objective C,Oop,Class,Foundation,Fast Enumeration,我正在实现一个应用程序,其中类的两个实例以及类本身都有“子对象”(放在NSMutableArray中)。这是一个相当复杂的应用程序,但得益于Objective-C,这是一件轻而易举的事:类本身就是对象,可以有方法和“变量”(借助于静态变量等) 为了方便起见,我在实例(使用-)和类(使用+)上实现了accessor/setter方法,以获取和操作“子对象”,而无需直接访问数组。我希望尽可能地关闭我的对象,并且这些方法进行一些数据验证 我还从NSFastEnumeration协议中实现了一个快速枚举

我正在实现一个应用程序,其中类的两个实例以及类本身都有“子对象”(放在
NSMutableArray
中)。这是一个相当复杂的应用程序,但得益于Objective-C,这是一件轻而易举的事:类本身就是对象,可以有方法和“变量”(借助于静态变量等)

为了方便起见,我在实例(使用
-
)和类(使用
+
)上实现了accessor/setter方法,以获取和操作“子对象”,而无需直接访问数组。我希望尽可能地关闭我的对象,并且这些方法进行一些数据验证

我还从
NSFastEnumeration
协议中实现了一个快速枚举实例方法。问题来了:我能实现一个快速枚举类方法并将它与Objective-C的
for…in
构造一起使用吗?换言之,我是否可以实现这一点:

+ (NSUInteger)countByEnumeratingWithState: (NSFastEnumerationState *)state objects: (__unsafe_unretained id [])buffer count: (NSUInteger)len;
然后在这样的地方使用它:

for (id child in [MyClass class]) {
    // Do magic stuff…
}
我浏览了GNUStep的
GSFastEnumeration.h
文件,该文件将快速枚举作为一个宏来实现,它肯定了上述的可能性,但我不确定苹果是否也这样做


即使我不能将
NSFastEnumeration
协议与我的类对象相关联,没有该协议的快速枚举是否可能(并且是未来的证明)?

方法
-countbyEnumerating with state:objects:count:
是整个快速枚举协议,我相信,该协议主要用于描述(实现协议比声明具有正确签名的方法更容易)。我希望它可以正常工作,但我没有这方面的参考。不过,您可能希望循环使用
[MyClass]


我可能会认为它是未来的证据。注意,在你的类对象周围只做一个小包装器类,除了执行<代码> NStFlaseQuests< /Cl>之外,并将实例方法<代码> -CONTUBEPROCEDATION带状态:对象:计数: >到类的方法>代码> + CONTUBEPROCEDATION:STOR:对象:这将是非常微不足道的。s:count:

我建议创建一个与
NSFastEnumeration
方法相同的类方法的协议。然后,您可以按如下方式在
[MyClass class]
上迭代

我能

嗯,你试过了吗?它有效吗?如果你试过,你会注意到它确实可以编译和工作

为什么不应该呢?类对象和其他对象一样都是对象。类方法只是碰巧在类对象上的方法。如果你向类对象发送消息,它将调用类方法;而如果你向非类对象发送消息,它将调用实例方法。因此,你可以在类对象上放置类方法类并使用该类对象,就像在其类上放置实例方法来使用普通对象一样

唯一可能的区别是类对象不会显式符合
NSFastEnumeration
协议,类似于在一个普通对象上循环,该对象的类没有显式指定它符合
NSFastEnumeration
协议。所以问题是,他们是否检查对象是否显式符合协议o在使用协议之前检查协议(而不是检查它是否响应选择器)


根据我的经验,对于几乎所有的Cocoa,对于表示需要符合协议的对象的API,您可以给出一个不明确符合协议的对象,但实现了协议的所有方法,并且它可以正常工作。(他们怎么检查呢?如果他们使用
conformsToProtocol:
,这对类对象不起作用,因为有一个
+conformsToProtocol:
,它有不同的含义。他们可能必须使用运行时函数或特殊情况类对象。)例如,
NSDictionary
文档说明它的键必须符合
NSCopying
,但是如果您有一个对象不符合
NSCopying
,但实现了
copyWithZone:
,它就可以正常工作。(事实上,有一个
+copyWithZone:
方法,它声明的目的是允许类对象用作字典键,因此显然,它的目的是键不需要显式地符合
NSCopying

它确实有效,但我想知道它是否能证明未来。但正如你所说,即使不符合协议,它也可能是好的……而且会一直如此。
//Protocol implementation
@protocol FastClassEnumeration <NSObject>
@required
+ (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id [])buffer count:(NSUInteger)len;
@end
//Class implementation
@interface EnumeratedClass : NSObject<FastClassEnumeration>
@end
@implementation EnumeratedClass

+ (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id [])buffer count:(NSUInteger)len
{
    static const unsigned long items_length = 4;
    static NSString * items[items_length] = { @"item1", @"item2", @"item3", @"item4" };

    if(state->state >= items_length)
    {
        return 0;
    }

    state->itemsPtr = items;
    state->state = items_length;
    state->mutationsPtr = (unsigned long *)self;

    return items_length;
}

@end
//Usage
...
    for(NSString *item in [EnumeratedClass class])
    {
        NSLog(@"%@", item);
    }
...