我最近一直在使用enumerateObjectsUsingBlock:很多我的快速枚举需求,而且我很难理解BOOL *stop枚举块中的用法.
在NSArray类引用状态
stop:对布尔值的引用.该块可以将值设置YES为停止进一步处理数组.这个stop论点是一个唯一的论点.您应该只将此布尔值设置YES为块内.
那么当然我可以在我的块中添加以下内容来停止枚举:
if (idx == [myArray indexOfObject:[myArray lastObject]]) {
*stop = YES;
}
Run Code Online (Sandbox Code Playgroud)
从我能够说的,没有明确设置*stop到YES没有任何负面的副作用.枚举似乎在数组的末尾自动停止.那么*stop在一个区块中使用真的有必要吗?
cocoa-touch enumeration objective-c nsarray fast-enumeration
这会发生什么?安全吗?
NSArray *nullArray=nil;
for (id obj in nullArray) {
// blah
}
Run Code Online (Sandbox Code Playgroud)
更具体地说,我必须这样做:
NSArray *array=[thing methodThatMightReturnNil];
if (array) {
for (id obj in array) {
// blah
}
}
Run Code Online (Sandbox Code Playgroud)
或者这样好吗?:
for (id obj in [thing methodThatMightReturnNil]) {
// blah
}
Run Code Online (Sandbox Code Playgroud) 我能指望它从数组的开头到结尾的顺序吗?在文档中找不到任何关于此的内容.
即是
for (id val in array)
{
NSLog(@"%@", val);
}
Run Code Online (Sandbox Code Playgroud)
总是打印出来的
for (int i = 0; i < [array count]; ++i)
{
NSLog(@"%@", [array objectAtIndex:i]);
}
Run Code Online (Sandbox Code Playgroud) 我想在使用快速枚举时得到当前对象的索引,即
for (MyClass *entry in savedArray) {
// What is the index of |entry| in |savedArray|?
}
Run Code Online (Sandbox Code Playgroud) 我想知道如何将下面的客观c代码转换成swift.
这将遍历我想要的视图上的所有子视图,检查它们是否是文本字段,然后检查它们是否为空.
for (UIView *view in contentVw.subviews) {
NSLog(@"%@", view);
if ([view isKindOfClass:[UITextField class]]) {
UITextField *textfield = (UITextField *)view;
if (([textfield.text isEqualToString:""])) {
//show error
return;
}
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,这里是我快速翻译的地方:
for view in self.view.subviews as [UIView] {
if view.isKindOfClass(UITextField) {
//...
}
}
Run Code Online (Sandbox Code Playgroud)
任何帮助都会很棒!
目标是比较两个数组并检查它们是否包含相同的对象(尽可能快 - 数组中有很多对象).无法检查数组,isEqual:因为它们的排序方式不同.
我已经尝试过这里发布的解决方案(/sf/answers/79689221/ - 请参阅Peter Hosey发布的帖子的最后一个代码片段).但这不适用于不同排序的数组.
我现在使用的代码如下:
+ (BOOL)arraysContainSameObjects:(NSArray *)array1 andOtherArray:(NSArray *)array2 {
// quit if array count is different
if ([array1 count] != [array2 count]) return NO;
BOOL bothArraysContainTheSameObjects = YES;
for (id objectInArray1 in array1) {
BOOL objectFoundInArray2 = NO;
for (id objectInArray2 in array2) {
if ([objectInArray1 isEqual:objectInArray2]) {
objectFoundInArray2 = YES;
break;
}
}
if (!objectFoundInArray2) {
bothArraysContainTheSameObjects = NO;
break;
}
}
return bothArraysContainTheSameObjects;
}
Run Code Online (Sandbox Code Playgroud)
这有效,但这些是两个嵌套的快速枚举.有没有办法做更快的比较?
我有一个班级,我希望我的班级确认NSFastEnumeration协议.我已阅读文档,但不是很清楚.有人可以告诉我协议方法应该返回什么以及它是如何工作的?
我正在与一个API进行通信,该API将我的应用程序所需的数据作为响应发送回NSDictionary(数据基本上是一个提要).此数据按最新到最旧排序,最新项目位于NSDictionary的前面.
当我快速枚举它们时for (NSString *key in articles) { ... },顺序似乎是随机的,因此我操作它们的顺序不是从最新到最旧,就像我想要的那样,而是完全随机的.
我已经读过了,当使用NSDictionary的快速枚举时,不保证按顺序迭代通过数组.
但是,我需要它.如何按NSDictionary所在的顺序迭代NSDictionary?
从实验看,集合表达式只被评估一次.考虑这个例子:
static NSArray *a;
- (NSArray *)fcn
{
if (a == nil)
a = [NSArray arrayWithObjects:@"one", @"two", @"three", nil];
NSLog(@"called");
return a;
}
...
for (NSString *s in [self fcn])
NSLog(@"%@", s);
Run Code Online (Sandbox Code Playgroud)
输出是:
2010-10-07 07:37:31.419 WidePhotoViewer Lite[23694:207] called
2010-10-07 07:37:31.420 WidePhotoViewer Lite[23694:207] one
2010-10-07 07:37:31.425 WidePhotoViewer Lite[23694:207] two
2010-10-07 07:37:31.425 WidePhotoViewer Lite[23694:207] three
Run Code Online (Sandbox Code Playgroud)
表示[self fcn]只被调用一次.
任何人都可以确认这是指定的(而不仅仅是观察到的)行为吗?
我的想法是做这样的事情:
for (UIView *v in [innerView subviews]) {
Run Code Online (Sandbox Code Playgroud)
而不是这个:
NSArray *vs = [innerView subviews];
for (UIView *v in vs) {
Run Code Online (Sandbox Code Playgroud)
思考?
我一遍又一遍地看到这一点,为什么在循环中使用快速枚举而不是NSEnumerator使用它更快nextObject:.
fast-enumeration ×10
objective-c ×9
ios ×3
cocoa-touch ×2
nsarray ×2
arrays ×1
cocoa ×1
enumeration ×1
for-in-loop ×1
for-loop ×1
foreach ×1
iphone ×1
iteration ×1
nsdictionary ×1
nsenumerator ×1
swift ×1