理解 iOS 开发中的 NS_ENUM 和 NS_OPTIONS

news2025/1/12 12:23:51

在开发 iOS 应用程序时,理解 NS_ENUMNS_OPTIONS 的使用至关重要,因为它们在定义和管理枚举和选项方面起着重要作用。在本文中,我们将深入探讨 NS_ENUMNS_OPTIONS 之间的区别、使用场景以及如何有效地实现它们。

NS_ENUM

NS_ENUM 用于定义枚举类型,其中每个枚举值都是互斥的。这意味着一个 NS_ENUM 类型的变量在任何时候只能持有一个值。它通常用于描述状态、类型或分类。

示例:

typedef NS_ENUM(NSInteger, AnimalType) {
    AnimalTypeDog,
    AnimalTypeCat,
    AnimalTypeBird
};

在这个例子中,AnimalType 类型的变量可以是 AnimalTypeDogAnimalTypeCatAnimalTypeBird,但每次只能是其中一个。

使用场景:
NS_ENUM 适用于需要表示一组可能状态中的单一状态的情况。例如,交通灯的颜色、用户角色或支付状态。

示例:

typedef NS_ENUM(NSInteger, TrafficLightState) {
    TrafficLightStateRed,
    TrafficLightStateYellow,
    TrafficLightStateGreen
};

TrafficLightState currentState = TrafficLightStateRed;
NS_OPTIONS

NS_OPTIONS 用于定义位掩码枚举类型,其中每个值表示一个独立的位。这允许使用按位操作符组合多个选项。它常用于设置多个标志或选项。

示例:

typedef NS_OPTIONS(NSUInteger, FilePermissions) {
    FilePermissionRead    = 1 << 0,  // 0001
    FilePermissionWrite   = 1 << 1,  // 0010
    FilePermissionExecute = 1 << 2   // 0100
};

FilePermissions permissions = FilePermissionRead | FilePermissionWrite; // 0011

在这个例子中,FilePermissions 类型的变量可以同时具有读和写权限。

使用场景:
NS_OPTIONS 适用于需要表示多个组合选项的情况。例如,文件访问权限、UI 组件状态或功能标志。

示例:

typedef NS_OPTIONS(NSUInteger, FilePermissions) {
    FilePermissionRead    = 1 << 0,  // 0001
    FilePermissionWrite   = 1 << 1,  // 0010
    FilePermissionExecute = 1 << 2   // 0100
};

FilePermissions permissions = FilePermissionRead | FilePermissionWrite; // 0011

// 判断某个权限是否启用
if (permissions & FilePermissionRead) {
    NSLog(@"Read permission is enabled");
}

if (permissions & FilePermissionWrite) {
    NSLog(@"Write permission is enabled");
}

if (permissions & FilePermissionExecute) {
    NSLog(@"Execute permission is enabled");
} else {
    NSLog(@"Execute permission is not enabled");
}
组合多个选项

NS_OPTIONS 是通过位掩码实现的,这使得可以组合多个选项。例如,要组合多个文件权限,可以使用按位或操作符 (|):

FilePermissions permissions = FilePermissionRead | FilePermissionWrite; // 0011
判断某个选项是否启用

要判断某个选项是否启用,可以使用按位与操作符 (&)。如果结果不为 0,则表示该选项启用:

if (permissions & FilePermissionRead) {
    NSLog(@"Read permission is enabled");
}

if (permissions & FilePermissionWrite) {
    NSLog(@"Write permission is enabled");
}

if (permissions & FilePermissionExecute) {
    NSLog(@"Execute permission is enabled");
} else {
    NSLog(@"Execute permission is not enabled");
}

NS_OPTIONS 的底层实现

NS_OPTIONS 的底层实现是通过定义位掩码值来实现的。每个选项都是一个唯一的位,使用移位操作 (1 << n) 来定义。最终组合起来的值是这些位的按位或结果。

示例代码实现及注释
typedef NS_OPTIONS(NSUInteger, FilePermissions) {
    FilePermissionRead    = 1 << 0,  // 0001
    FilePermissionWrite   = 1 << 1,  // 0010
    FilePermissionExecute = 1 << 2   // 0100
};

// 组合权限
FilePermissions permissions = FilePermissionRead | FilePermissionWrite; // 0011

// 判断权限
if (permissions & FilePermissionRead) {
    NSLog(@"Read permission is enabled");
}

if (permissions & FilePermissionWrite) {
    NSLog(@"Write permission is enabled");
}

if (permissions & FilePermissionExecute) {
    NSLog(@"Execute permission is enabled");
} else {
    NSLog(@"Execute permission is not enabled");
}

关键区别

  1. 互斥性 vs. 组合

    • NS_ENUM 值是互斥的。
    • NS_OPTIONS 值可以通过按位操作符组合。
  2. 使用场景

    • 使用 NS_ENUM 表示一组状态中的单一状态。
    • 使用 NS_OPTIONS 表示一组可组合的选项或标志。
  3. 实现方式

    • NS_ENUM 使用普通的整数值。
    • NS_OPTIONS 使用位移操作定义唯一的位。

结论

理解何时使用 NS_ENUMNS_OPTIONS 对于高效的 iOS 开发至关重要。通过选择合适的方法,你可以编写出更具可读性、可维护性和效率的代码。无论你需要定义一组互斥状态还是一组可组合的选项,NS_ENUMNS_OPTIONS 都提供了必要的工具来处理这些场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1854327.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python - 调用函数时检查参数的类型是否合规

前言 阅读本文大概需要3分钟 说明 在python中&#xff0c;即使加入了类型注解&#xff0c;使用注解之外的类型也是不报错的 def test(uid: int):print(uid)test("999")但是我就想要类型不对就直接报错确实可以另辟蹊径&#xff0c;实现报错&#xff0c;似乎有强…

网络编程篇:HTTP协议

一.预备知识 在客户端访问服务端时&#xff0c;要用ipport&#xff0c;但是在日常用户访问服务端的时候&#xff0c;并不会直接使用ip&#xff0c;而是使用域名&#xff0c;比如&#xff1a;百度(www.baidu,com)。 …

【机器学习】音乐大模型的深入探讨——当机器有了创意,是机遇还是灾难?

&#x1f440;国内外音乐大模型基本情况&#x1f440; ♥概述♥ ✈✈✈如FreeCompose、一术科技等&#xff0c;这些企业专注于开发人工智能驱动的语音、音效和音乐生成工具&#xff0c;致力于利用核心技术驱动文化产业升级。虽然具体公司未明确提及&#xff0c;但可以预见的是…

MFC学习--CListCtrl复选框以及选择

如何展示复选框 //LVS_EX_CHECKBOXES每一行的最前面带个复选框//LVS_EX_FULLROWSELECT整行选中//LVS_EX_GRIDLINES网格线//LVS_EX_HEADERDRAGDROP列表头可以拖动m_listctl.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES | LVS_EX_GRIDLINES); 全选&#xff0c;全…

.hmallox勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复

导言&#xff1a; 在当今数字化时代&#xff0c;勒索病毒已经成为网络安全的一大威胁&#xff0c;其中包括了最近出现的.hmallox勒索病毒。这类恶意软件不仅能够对计算机系统进行加密&#xff0c;还会要求用户支付赎金以换取解密密钥&#xff0c;给个人用户和企业带来了严重的…

八大排序之希尔排序

一、概念及其介绍 希尔排序(Shell Sort)是插入排序的一种&#xff0c;它是针对直接插入排序算法的改进。 希尔排序又称缩小增量排序&#xff0c;因 DL.Shell 于 1959 年提出而得名。 它通过比较相距一定间隔的元素来进行&#xff0c;各趟比较所用的距离随着算法的进行而减小…

分类接口开发

文章目录 1.查询所有一级分类1.sun-club-application-controller 控制层1.SubjectCategoryController.java 定义基础的queryPrimaryCategory&#xff0c;调用领域层 2.sun-club-domain 领域层1.SubjectCategoryDomainService.java2.SubjectCategoryConverter.java3.SubjectCate…

PINN解偏微分方程实例4

PINN解偏微分方程实例4 一、正问题1. Diffusion equation2. Burgers’ equation3. Allen–Cahn equation4. Wave equation 二、反问题1. Burgers’ equation3. 部分代码示例 本文使用 PINN解偏微分方程实例1中展示的代码求解了以四个具体的偏微分方程&#xff0c;包括Diffusio…

编程精粹—— Microsoft 编写优质无错 C 程序秘诀 07:编码中的假象

这是一本老书&#xff0c;作者 Steve Maguire 在微软工作期间写了这本书&#xff0c;英文版于 1993 年发布。2013 年推出了 20 周年纪念第二版。我们看到的标题是中译版名字&#xff0c;英文版的名字是《Writing Clean Code ─── Microsoft’s Techniques for Developing》&a…

C语言入门课程学习笔记8:变量的作用域递归函数宏定义交换变量

C语言入门课程学习笔记8 第36课 - 变量的作用域与生命期&#xff08;上&#xff09;第37课 - 变量的作用域与生命期&#xff08;下&#xff09;实验—局部变量的作用域实验-变量的生命期 第38课 - 函数专题练习第39课 - 递归函数简介实验小结 第40课 - C 语言中的宏定义实验小结…

基于STM32的智能农业灌溉系统

目录 引言环境准备智能农业灌溉系统基础代码实现&#xff1a;实现智能农业灌溉系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统实现4.4 用户界面与数据可视化应用场景&#xff1a;智能农业管理与优化问题解决方案与优化收尾与总结 1. 引言 智能农业灌溉系统通过使用ST…

lvgl_micropython development for esp32

​​​​​​上一篇博客已经编译源码生成了ESP32C3的固件lvgl_micropy_ESP32_GENERIC_C3-4.bin&#xff0c;这篇博客开发一个界面。 一、开发环境 1、安装开发工具 Windows安装Thonny工具&#xff0c;官网链接&#xff1a;Thonny, Python IDE for beginners。 参考博客:用M…

AIGC时代算法工程师的面试秘籍(2024.5.27-6.9第十五式) |【三年面试五年模拟】

写在前面 【三年面试五年模拟】旨在整理&挖掘AI算法工程师在实习/校招/社招时所需的干货知识点与面试方法&#xff0c;力求让读者在获得心仪offer的同时&#xff0c;增强技术基本面。也欢迎大家提出宝贵的优化建议&#xff0c;一起交流学习&#x1f4aa; 欢迎大家关注Rocky…

解析 flink sql 转化成flink job

文章目录 背景流程flink实例实现细节定义的规则定义的物理算子定义的flink exec node 背景 在很多计算引擎里&#xff0c;都会把sql 这种标准语言&#xff0c;转成计算引擎下底层实际的算子&#xff0c;因此理解此转换的流程对于理解整个过程非常重要 流程 flink实例 public…

绘制口罩maskTheFace数据源是300w_lp

官网下载mask the face 代码&#xff0c;增加代码draw_face.py import argparse import cv2 import scipy.io from tqdm import tqdm from utils.aux_functions_2 import *# 设置命令行输入参数 parser argparse.ArgumentParser(description"MaskTheFace - Python code…

C++的特殊类设计 饥饿汉模式

目录 特殊类设计 设计一个不能被拷贝的类 设计一个只能在堆上创建对象的类 设计一个只能在栈上创建对象的类 设计一个不能继承的类 设计模式 单例模式 饿汉模式 饥汉模式 特殊类设计 设计一个不能被拷贝的类 C98的设计方式&#xff1a;将该类的拷贝构造和赋值运算符…

OpenGL3.3_C++_Windows(17)

Demo演示 demo演示 绘制不同的图元&#xff08;点&#xff0c;线…&#xff09;&#xff1a; 理解 glDrawArrays 和 glDrawElements的区别 glDrawArrays &#xff1a;渲染的图元模式mode&#xff08;可以参考&#xff09;&#xff0c;起始位置&#xff0c;顶点数量glDrawElem…

昇思25天学习打卡营第2天|张量Tensor

一、张量的定义&#xff1a; 张量是一种特殊的数据结构&#xff0c;与数组和矩阵非常相似。张量&#xff08;Tensor&#xff09;是MindSpore网络运算中的基本数据结构&#xff08;也是所有深度学习模型的基础数据结构&#xff09;&#xff0c;下面将主要介绍张量和稀疏张量的属…

Maven的依赖传递、依赖管理、依赖作用域

在Maven项目中通常会引入大量依赖&#xff0c;但依赖管理不当&#xff0c;会造成版本混乱冲突或者目标包臃肿。因此&#xff0c;我们以SpringBoot为例&#xff0c;从三方面探索依赖的使用规则。 1、 依赖传递 依赖是会传递的&#xff0c;依赖的依赖也会连带引入。例如在项目中…

大型企业网络DHCP服务器配置安装实践@FreeBSD

企业需求 需要为企业里的机器配置一台DHCP服务器。因为光猫提供DHCP服务的能力很差&#xff0c;多机器dhcp多机器NAT拓扑方式机器一多就卡顿。使用一台路由器来进行子网络的dhcp和NAT服务&#xff0c;分担光猫负载&#xff0c;但是还有一部分机器需要放到光猫网络&#xff0c;…