Object-C之块枚举的使用

Objective-C中队列特定数据和块枚举的使用 在Objective-C编程中,队列特定数据的使用和块枚举是处理集合和并发任务的重要概念。队列特定数据的行为基于指针值,与NSDictionary对象的键值比较不同,这在内存管理和避免死锁方面提供了灵活性。块枚举提供了一种更加简洁和高效的方式来遍历集合,无论是数组、字典还是集合,都能通过块传递具体操作,提高代码的可读性和效率。 阅读详情

在编程中经常需要列举collection(包含NSArrray,NSDictionary,NSSet等)中得元素,当前的Object-C语言有很多办法实现此功能,可以用标准的C语言循环,也可以用Object-C 1.0 的NSEnumerator以及Object-C 2.0的快速遍历(fast enumeration)。当语言中引入了“块”这一特性后。又多出几种新的遍历方式,而这几种方式容易被开发者忽视。采用这几种新方式遍历collection时,可以传入块,而collection中得每个元素都可能会放在块里面运行一遍,这种做法通常会大幅度的简化编码过程。如果了解过NSEnumerator的开发者可以直接从“基于块的遍历”看起。如果没有了解过的话,下面的例子会让你快速的了解NSEnumerator和块枚举。小编下面会详细介绍。

for循环

遍历数组的第一种方法就是采用老式的for循环,直接上码,更容易理解。

    //for循环遍历
    //NSArray
    NSArray *anArray = [NSArray arrayWithObjects:@"林志玲",@"范冰冰",@"张馨予", nil];
    for(int i = 0;i < anArray.count;i++)
    {
        id object = anArray[i];
        // do something with "object"
        NSLog(@"object_array:%@",object);
    }

    //Dictionary
    NSDictionary *anDictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"林志玲",@"name",@"15810463139",@"number", nil];
    NSArray *keys = [anDictionary allKeys];
    for(int i = 0;i < keys.count;i++)
    {
        id key = keys[i];
        id value = anDictionary[key];
        // do something with "key" and "value"
        NSLog(@"value:%@ key:%@",value,key);


    }
    //Set
    NSSet *anSet = [NSSet setWithObjects:@"林志玲",@"范冰冰",@"张馨予",nil];
    NSArray *objects = [anSet allObjects];
    for(int i = 0;i < objects.count;i++)
    {
        id object = objects[i];
        // do something with "object"
        NSLog(@"object_set:%@",object);

    }

使用Object-C 1.0 的NSEnumerator 来遍历

NSEnumerator是个抽象基类,其中只定义了两个方法,供其具体子类实现:
allobjects 和 nextObject。其中关键的方法是 nextObject,它返回枚举里面的下个对象。每次调用该方法时,数据结构都会更新。使得下次调用方法时返回下个对象。等到枚举中得所有对象都已经返回之后,再调用就将返回nil,这表示到枚举末端啦。
直接上码吧,更直白。。。。

    //NSEnumerator遍历
    //NSArray
    NSArray *anArray = [NSArray arrayWithObjects:@"林志玲",@"范冰冰",@"张馨予", nil];
    NSEnumerator *enumeratorArr = [anArray objectEnumerator];
    id object;
    while ((object = [enumeratorArr nextObject]) != nil) {
        // do something with "object"
        NSLog(@"object_array:%@",object);
    }

    //Dictionary
    NSDictionary *anDictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"林志玲",@"name",@"15810463139",@"number", nil];
    NSEnumerator *enumeratorDic = [anDictionary objectEnumerator];
    id key;
    while ((key = [enumeratorDic nextObject] )!= nil) {
        id value = anDictionary[key];
        // do something with "key" and "value"
        NSLog(@"value:%@ key:%@",value,key);
    }

    //Set
    NSSet *anSet = [NSSet setWithObjects:@"林志玲",@"范冰冰",@"张馨予",nil];
    NSEnumerator *enumeratorSet = [anSet objectEnumerator];
    id  objectSet;
    while ((objectSet = [enumeratorSet nextObject]) != nil) {
        // do something with "object"
        NSLog(@"object_set:%@",object);

    }

总结:这种写法的功能与标准的for循环相似,但是代码却多了一些。真正的优势在于:不论遍历那种collection,都可以采用这套相似的语法。代码读起来更顺畅。

快速遍历

Object-C 2.0 引入了快速遍历这一功能,快速遍历与使用NSEnumerator 来遍历差不多,然而语法更简洁,它为for循环开设了 in 关键字。这个关键字大幅简化了遍历collection所需的语法。
代码更容易理解

 //快速遍历
    //NSArray
    NSArray *anArray = [NSArray arrayWithObjects:@"林志玲",@"范冰冰",@"张馨予", nil];
    for (id object  in anArray) {
        // do something with "object"
        NSLog(@"object_array:%@",object);
    }

    //Dictionary
    NSDictionary *anDictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"林志玲",@"name",@"15810463139",@"number", nil];
    for (id key in anDictionary) {
        id  value = anDictionary[key];
        // do something with "key" and "value"
        NSLog(@"value:%@ key:%@",value,key);
    }

    //Set
    NSSet *anSet = [NSSet setWithObjects:@"林志玲",@"范冰冰",@"张馨予",nil];
    for (id object in anSet) {
        // do something with "object"
        NSLog(@"object_set:%@",object);

    }

由于NSEnumerator 对象也实现啦NSFastEnumerator协议,所以能用来执行反向遍历。若要用反向遍历数组,可采用下面这种写法:

NSArray *aArray = [NSArray arrayWithObjects:@"林志玲",@"范冰冰",@"张馨予", nil];
    for (id object  in [aArray reverseObjectEnumerator]) {
        // do something with "object"
        NSLog(@"object_array:%@",object);
    }

在目前介绍的遍历方式中,这种方法是语法最简单且效率最高的,然后如果在遍历字典时需要同时获取键与值,那么会多出来一步。缺点是无法获取当前遍历操作所针对的下标。
上面都是开胃菜,了解过NSEnumerator 的开发者可以直接跳到下面的“基于块的遍历方式”。

基于块的遍历方式

在当前的Object-C语言中,最新引入的一种做法就是基于块来遍历。NSArray中定义了下面这个方法,它可以实现最基本的遍历功能:

- (void)enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop))block

初次之外,还有一系列类似的遍历方法,它们可以接受各种选项,以便控制遍历操作。在遍历数组及集合时,每次迭代都要执行由block参数所传入的块, 这个块有三个参数,分别是当地前迭代针对的对象,所针对的下标,以及指向布尔值的指针。前两个参数的含义不言而喻。而通过第三个参数所提供的机制,开发者可以终止遍历操作。
先上一段代码消化消化:

NSArray *aArray = [NSArray arrayWithObjects:@"林志玲",@"范冰冰",@"张馨予", nil];
    [aArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        // do something with "object"
        BOOL shouldStop;
        NSLog(@"obj:%@ idx:%ld",obj,idx);
        if ([obj isEqualToString:@"范冰冰"]) {
            shouldStop = YES;
        }
        if (shouldStop) {
            *stop = YES;
        }
    }];

这种写法稍微多了几行代码,不过依然明晰,而且遍历时既能获取对象,也能知道其下标。此方法还提供了一种很棒的机制,用来终止遍历操作,开发者可以通过stop变量来实现终止操作。当然,使用其他几种遍历方式,也可以通过break来实现终止循环。
此方法不仅可以用来遍历数组。NSSet里面也有同样地块枚举方法,NSDictionary也是这样,只是略有不同。

- (void)enumerateKeysAndObjectsUsingBlock:(void (^)(id key, id obj, BOOL *stop))block

要点

*遍历collection有四种方式。最基本的办法是for循环,其次是NSEnumerator遍历方法及快速遍历,最新,最先进的是“块枚举”法。
*“块枚举”法本身就通GCD来并发执行遍历操作,无须另行编写代码。而采用其他遍历方式无法轻易实现这一点。
*若提前知道待遍历的collection含有何种对象,则应该修改块签名,指出对象的具体类型。

深入理解Objective-C中的集合枚举与内存管理 本文深入探讨了Objective-C中数组、字典和集合的枚举方法,并介绍了无费用桥接技术如何在Foundation的Objective-C对象和CoreFoundation的C数据结构之间无缝转换。同时,文章还介绍了NSCache的使用,相比NSDictionary,NSCache提供了自动内存管理的缓存功能。 阅读详情

相关推荐

STM32在六轴机械臂实时控制中的选型与分层架构设计

嵌入式实时控制系统中,微控制器的选型直接决定运动控制精度与系统可靠性。其核心在于匹配确定性中断响应、低延迟外设协同与工业协议栈支持等硬性指标。STM32凭借Cortex-M内核的NVIC调度能力、成熟HAL库及CAN FD/高级定时器等专用外设,在机电一体化场景中成为伺服控制中枢的首选。相比ESP32等通用MCU,STM32在硬实时性、EMC认证生态和工业总线兼容性上具备不可替代优势。本文围绕GTB六轴机械臂项目,详解基于STM32F407的硬件抽象层配置、FreeRTOS任务调度、事件队列解耦及闭环控制数

jupi8的博客 754

16.C enum(枚举)

C enum(枚举) 枚举是 C 语言中的一种基本数据类型,它可以让数据更简洁,更易读。 枚举语法定义格式为: enum 枚举名 {枚举元素1,枚举元素2,……}; 接下来我们举个例子,比如:一星期有 7 天,如果不用枚举,我们需要使用 #define 来为每个整数定义一个别名: ...

chengsi7614的博客 1159

通达信缠论中枢自动识别与画线实战指南

本文详细介绍了通达信缠论中枢自动识别与画线公式的实战应用。该工具通过严谨的算法逻辑,自动在K线图上标记出符合缠论定义的中枢区间,帮助投资者摆脱繁琐的手工画图,聚焦于价格与中枢的互动关系,从而高效识别趋势延续、背驰及第三类买卖点,提升缠论分析与交易决策的效率。

weixin_29267307的博客 660

C语言学习--枚举

在编程中,定义和使用枚举类型是组织和管理有限数据集的一种有效方式。枚举类型提供了一种便捷的方式来描述一组相关的常量,使得代码更具可读性和可维护性。传统的使用宏定义来表示这些常量的方法虽然有效,但随着常量数量的增加,管理和维护会变得繁琐。枚举提供了一种更结构化的方式来定义这些常量,同时还能够确保它们的值在使用时更具语义性和一致性。本文将介绍枚举的基本概念、使用方法及其在 C 语言中的应用。1) 枚举是 C 语言中的一种构造数据类型,它可以让数据更简洁,更易读, 对于只有几个有限的特定数据,可以使用枚举。

weixin_62881069的博客 1636

ThingsBoard 仪表板状态

请先通过阅读仪表板概述和仪表板入门案例来熟悉ThingsBoard的仪表板。文章希望通过浅显的文字描述什么是仪表板状态及如何使用。 概念 状态功能使得仪表板可以分层,配合小部件的动作,实现多层仪表板之间的跳转.每个状态对应一个仪表板的图层 每个仪表板有一个默认的根状态, 根状态可以理解为默认状态, 也就是打开仪表板默认展示的仪表板图层.编辑模式下, 点击右上角的图标来管理状态.添加多个状态后左上角出现状态切换(图层切换)下拉列表可以通过选中根状态复选框切换新的默认展示的状态/图层配合小部件的动作,实现状

物联网三分钟 2308

BEVFormer详解

BEVFormer 是将Transformer架构的自注意机制与BEV视图中3D检测结合起来的一种纯视觉目标检测方案。对于纯视觉的BEV检测方案,其中的重中之重就是如何将2D的图像特征映射到3D空间的BEV栅格,既然是映射关系,那就有前行投影和反向查询两种机制。前向投影是基于深度估计的方法,参考基于深度估计的BEV视图转换方法,典型代表为LSS。反向查询方法思路为先将BEV栅格在Z方向上进行lift提升,然后再映射到图像特征图上进行特征查询。BEVFormer 就是基于这种机制进行2D图像特征到3D空间的B

MAX的专栏 4744

Objective-C枚举类型详解

最近看了一本OC进阶的书,很多人推荐的Effective Objictive-C2.0,看到书中枚举类型的介绍,觉得很不错,这里为大家总结一下。enum由于Objective-C基于C语言,所以C语言有的功能它都有,其中之一就是枚举类型enum。枚举类型只是一种常亮命名方式,某个对象所经历的各种状态或者类型就可以定义为一个简单的枚举类型,比如一个通讯录或者聊天页的页面类型可如下定义:enum Vie

EverStar's Blog 1万+

【feature_column处理】- indicator_column(指示列)和embedding_column(嵌入列)

1. 开胃菜 我们先来了解一下tf.feature_column.input_layer def input_layer(features, feature_columns, weight_collections=None, trainable=True, cols_to_vars=None, cols_to_output_tensors=None)

DataAlgo 1485

c语言枚举类型enum例子,c/c++开发分享C语言学习讲解之枚举类型实例

1.1 枚举定义枚举(enumerated type)声明代表整数常量的符号名称,关键字enum创建一个新的枚举类型。实际上,enum常量是int类型的。#include enum a{red, yellow, black};int main(){// yellow = 14; //错误,枚举是常量,值不能修改int a = red;printf("%dn", a);return 0;}注:枚举是...

weixin_42386511的博客 768

【漏洞复现】Palo Alto Networks PAN-OS GlobalProtect 命令注入漏洞 CVE-2024-3400

在特定PAN-OS版本和不同功能配置下,未经身份验证的攻击者可能利用此漏洞在防火墙上以root权限执行任意代码。技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。本文所提供的工具仅用于学习,禁止用于其他!poc如下,注入点在Cookie中,将其中的DNSlog地址替换为你的dnslog地址,借助DNSLOG来复现,可以使用http://dnslog.pw/

失心少年 1224

【Proteus仿真】用24C04与1602LCD设计的简易加密电子密码锁

【Proteus仿真】用24C04与1602LCD设计的简易加密电子密码锁

perseverance51博客 1121

C语言-枚举问题

枚举典型问题

NNLYF_的博客 934

YOLOv11改进策略【Neck】| arXiv 2025 分层多头注意力HMHA 子空间拆分提多样 + 通道重排降冗余,强化目标检测精度

HMHA(Hierarchical Multi-Head Attention,分层多头注意力)旨在解决传统多头注意力(MHA)在图像恢复任务中的核心缺陷——特征冗余。传统MHA将通道均匀拆分给各个头,导致不同头学习的子空间信息相似,进而出现多头关注同一区域、忽略退化区域修复的问题,限制了模型的特征表达能力。HMHA通过“分层子空间拆分+通道重排序”策略,让每个头学习差异化、互补的上下文特征,从根源上缓解冗余,提升图像恢复任务中对复杂退化场景的特征捕捉能力。

Limiiiing的博客 778

C语言枚举详解

C语言枚举详解

qq_28576837的博客 5万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

39 C 语言枚举类型、枚举常量、枚举变量、枚举的遍历、枚举数组、枚举与 switch

本文全面介绍了枚举(Enum)在编程中的基本概念与用法。首先阐述了枚举的定义及其类型,包括语法格式、枚举元素的特点,并通过案例演示了如何定义枚举类型。接着,深入探讨了枚举变量的概念、定义方式及其实战应用。文章还详细讲解了枚举的遍历方法,包括连续和非连续枚举常量的遍历技巧。此外,还介绍了枚举在 switch 语句中的使用以及枚举数组的相关知识。本文旨在帮助读者深入理解枚举,并能在实际编程中灵活运用。

大模型全栈工程师 · Thanks_ks 6744

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

如何在 C 语言中使用枚举类型?

枚举类型的定义使用enumenum 枚举名 {枚举值列表};其中,枚举名是自定义的枚举类型的名称,枚举值列表是用逗号分隔的一组常量值。在这个枚举中,Monday被自动赋值为 0,Tuesday被赋值为 1,以此类推。\n");在这个例子中,为枚举值enum Grade自定义了具体的数值,然后根据输入的等级进行相应的判断和输出。

发现生活,分享智慧,一起成长! 2194

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C语言菜鸟入门·枚举类型·enum的使用详解

枚举是 C 语言中的一种基本数据类型,用于定义一组具有离散值的常量,它可以让数据更简洁,更易读。枚举类型通常用于为程序中的一组相关的常量取名字,以便于程序的可读性和维护性。定义一个枚举类型,需要使用enum关键字,后面跟着枚举类型的名称,以及用大括号 {} 括起来的一组枚举常量。每个枚举常量可以用一个标识符来表示,也可以为它们指定一个整数值,如果没有指定,那么默认从 0 开始递增。enum 枚举名 {枚举元素1,枚举元素2,……};enum DAY这样看起来是不是更简洁了。

时光の尘的博客 1万+

Objective-C——OC中枚举的使用

OC中枚举的使用———- android培训、java培训、期待与您交流! ———-OC中枚举的使用 前言 用枚举表示一个操作的不同状态 状态组合使用枚举 switch中使用枚举前言由于Objective-C是C语言的超集,所以在OC程序中一般的常量表示也有宏定义   以及const 变量类型 变量 和枚举等形式,这里我们介绍些枚举的几种适用场合用枚举表示一个操作的不同状态我们随便举个例子

chenlongcreate的专栏 7836

C语言枚举类型enum详解、枚举变量。枚举函数

关键字:enum用途:定义一个取值受限制的整型变量,用于限制变量取值范围;

weixin_44057803的博客 1万+

C语言枚举类型使用

enum 枚举名 {枚举元素1,枚举元素2,……};1234567enum DAY {这样看起来是不是更简洁了。注意:第一个枚举成员的默认值为整型的 0,后续枚举成员的值在前一个成员上加 1。我们在这个实例中把第一个枚举成员的值定义为 1,第二个就为 2,以此类推。没有指定值的枚举元素,其值为前一元素加 1。也就说 spring 的值为 0,summer 的值为 3,autumn 的值为 4,winter 的值为 51、先定义枚举类型,再定义枚举变量enum DAY {

qq_67972375的博客 2732

Java枚举和C枚举的转换——JNI笔记

前言 最近在做中间件相关,遇到一个JAVA和C之间枚举值通过JNI传递的问题。我们知道C语言的枚举型是一个集合,其每个枚举成员是一个整型常量;而JAVA的枚举其本质是一个类,继承自Enum类,每个枚举成员是枚举类型常量。他们之间是不同的两种数据类型,不能直接进行转换。Java枚举和C枚举的转换本质是Java枚举类型和int整型的转换。 两种枚举的特点 新创建的枚...

Zhou2828的博客 4503

Objective-C 枚举的使用

在C、C++、Java这些语言中就有它们对应的枚举,定义的方式也多种多样,但使用目的只有一个:让代码可读性更强。这里我们只简单说说Objective-C中枚举的使用。 在Apple提供给我们的API中,经常会看到使用枚举的例子: 有这样的: typedef NS_ENUM(NSInteger, UIViewAnimationTransition) { UIViewAnimationT

driftAxe的专栏 1687

C枚举类型的使用方法

http://sharep.blog.51cto.com/539048/1143011. 枚举的定义枚举类型定义的一般形式为: enum 枚举名{ 枚举值表 };在枚举值表中应罗列出所有可用值。这些值也称为枚举元素。例如: 该枚举名为weekday,枚举值共有7个,即一周中的七天。凡被说明为weekday类型变量的取值只能是七天中的某一天。2. 枚举变量的说明如同结构和联合一样,枚举变量也可用不同的方式说明,即先定义后说明,同时定义说明或直

风无痕 3797

【C语言】枚举完全指南:定义、优势与使用

本文介绍了C语言中的枚举类型,解释其定义方式、常量特性及使用场景。枚举通过列举可能取值(如星期、性别等)提升代码可读性,支持默认值(从0开始递增)和自定义初始值。相比#define宏定义,枚举具有类型检查、调试友好等优势。文章通过计算器案例展示了枚举的实际应用价值,并指出C/C++在枚举赋值上的差异。最后强调枚举是现代C代码管理命名常量的优选方案。

suxi_na的博客 1477

Objective-C使用块枚举的细节

enumerateObjectsUsingBlock:的细节

侯仕奇的博客 949

编程小白C语言枚举在switch中的使用

C语言中,switch中可以使用枚举类型,比较简单,案例如下: #include<stdio.h> int main() { enum SEASONS { SPRING=1,SUMMER,AUTUMN,WINTER }; //定义枚举类型 enum SEASONS enum SEASONS season; //定义了一个枚举类型变量season(类型enum SEASO...

linux2422988311的博客 4867
上一篇: UITextView placeholder
下一篇: app跳转到AppStore评分
buringHe
博客等级 码龄12年 3粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值