iOS: 枚举类型 enum,NS_ENUM,NS_OPTIONS

2024-05-11 07:48
文章标签 类型 ios 枚举 enum options ns

本文主要是介绍iOS: 枚举类型 enum,NS_ENUM,NS_OPTIONS,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一般情况下,我们采用C风格的enum关键字可以定义枚举类型。

[cpp]  view plain copy
  1. enum{   
  2.     UIViewAnimationTransitionNone,  
  3.     UIViewAnimationTransitionFlipFromLeft,  
  4.     UIViewAnimationTransitionFlipFromRight,  
  5.     UIViewAnimationTransitionCurlUp,  
  6.     UIViewAnimationTransitionCurlDown,  
  7. } UIViewAnimationTransition;  
[cpp]  view plain copy
  1. //位移操作枚举定义  
  2. enum {  
  3.     UIViewAutoresizingNone                 = 0,  
  4.     UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,  
  5.     UIViewAutoresizingFlexibleWidth        = 1 << 1,  
  6.     UIViewAutoresizingFlexibleRightMargin  = 1 << 2,  
  7.     UIViewAutoresizingFlexibleTopMargin    = 1 << 3,  
  8.     UIViewAutoresizingFlexibleHeight       = 1 << 4,  
  9.     UIViewAutoresizingFlexibleBottomMargin = 1 << 5  
  10. };  
  11. typedef NSUInteger UIViewAutoresizing;//使用NSUInteger的地方可以使用UIViewAutoresizing,//UIViewAutoresizing相当于NSUInteger的一个别名使用。  
  12. //因此一个UIViewAutoresizing的变量可以直接赋值给NSUInteger  

枚举值一般是4个字节的int值,在64位系统上是8个字节。

在iOS6和Mac OS 10.8以后Apple引入了两个宏来重新定义这两个枚举类型,实际上是将enum定义和typedef合二为一,并且采用不同的宏来从代码角度来区分。

NS_OPTIONS一般用来定义位移相关操作的枚举值,我们可以参考UIKit.Framework的头文件,可以看到大量的枚举定义。

[cpp]  view plain copy
  1. typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {  
  2.     UIViewAnimationTransitionNone,//默认从0开始  
  3.     UIViewAnimationTransitionFlipFromLeft,  
  4.     UIViewAnimationTransitionFlipFromRight,  
  5.     UIViewAnimationTransitionCurlUp,  
  6.     UIViewAnimationTransitionCurlDown,  
  7. };  
  8.   
  9. typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {  
  10.     UIViewAutoresizingNone                 = 0,  
  11.     UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,  
  12.     UIViewAutoresizingFlexibleWidth        = 1 << 1,  
  13.     UIViewAutoresizingFlexibleRightMargin  = 1 << 2,  
  14.     UIViewAutoresizingFlexibleTopMargin    = 1 << 3,  
  15.     UIViewAutoresizingFlexibleHeight       = 1 << 4,  
  16.     UIViewAutoresizingFlexibleBottomMargin = 1 << 5  
  17. };  

这两个宏的定义在Foundation.framework的NSObjCRuntime.h中:

[cpp]  view plain copy
  1. #if (__cplusplus && __cplusplus >= 201103L && (__has_extension(cxx_strong_enums) || __has_feature(objc_fixed_enum))) || (!__cplusplus && __has_feature(objc_fixed_enum))  
  2. #define NS_ENUM(_type, _name) enum _name : _type _name; enum _name : _type  
  3. #if (__cplusplus)  
  4. #define NS_OPTIONS(_type, _name) _type _name; enum : _type  
  5. #else  
  6. #define NS_OPTIONS(_type, _name) enum _name : _type _name; enum _name : _type  
  7. #endif  
  8. #else  
  9. #define NS_ENUM(_type, _name) _type _name; enum  
  10. #define NS_OPTIONS(_type, _name) _type _name; enum  
  11. #endif  

[cpp]  view plain copy
  1. typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {  
展开得到:
[cpp]  view plain copy
  1. typedef enum UIViewAnimationTransition : NSInteger UIViewAnimationTransition;  
  2. enum UIViewAnimationTransition : NSInteger {  

从枚举定义来看,NS_ENUM和NS_OPTIONS本质是一样的,仅仅从字面上来区分其用途。NS_ENUM是通用情况,NS_OPTIONS一般用来定义具有位移操作或特点的情况(bitmask)。

实际使用时,可以直接定义:

[cpp]  view plain copy
  1. typedef enum : NSInteger {....} UIViewAnimationTransition;  
等效于上述定义。

参考文档:

1. http://nshipster.com/ns_enum-ns_options/

2.http://iamthewalr.us/blog/2012/11/ns_enum-and-ns_options/

这篇关于iOS: 枚举类型 enum,NS_ENUM,NS_OPTIONS的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/978927

相关文章

IDEA如何将String类型转json格式

《IDEA如何将String类型转json格式》在Java中,字符串字面量中的转义字符会被自动转换,但通过网络获取的字符串可能不会自动转换,为了解决IDEA无法识别JSON字符串的问题,可以在本地对字... 目录问题描述问题原因解决方案总结问题描述最近做项目需要使用Ai生成json,可生成String类型

C#实现获得某个枚举的所有名称

《C#实现获得某个枚举的所有名称》这篇文章主要为大家详细介绍了C#如何实现获得某个枚举的所有名称,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... C#中获得某个枚举的所有名称using System;using System.Collections.Generic;usi

Mysql 中的多表连接和连接类型详解

《Mysql中的多表连接和连接类型详解》这篇文章详细介绍了MySQL中的多表连接及其各种类型,包括内连接、左连接、右连接、全外连接、自连接和交叉连接,通过这些连接方式,可以将分散在不同表中的相关数据... 目录什么是多表连接?1. 内连接(INNER JOIN)2. 左连接(LEFT JOIN 或 LEFT

Java 枚举的常用技巧汇总

《Java枚举的常用技巧汇总》在Java中,枚举类型是一种特殊的数据类型,允许定义一组固定的常量,默认情况下,toString方法返回枚举常量的名称,本文提供了一个完整的代码示例,展示了如何在Jav... 目录一、枚举的基本概念1. 什么是枚举?2. 基本枚举示例3. 枚举的优势二、枚举的高级用法1. 枚举

Redis的Hash类型及相关命令小结

《Redis的Hash类型及相关命令小结》edisHash是一种数据结构,用于存储字段和值的映射关系,本文就来介绍一下Redis的Hash类型及相关命令小结,具有一定的参考价值,感兴趣的可以了解一下... 目录HSETHGETHEXISTSHDELHKEYSHVALSHGETALLHMGETHLENHSET

Rust中的Option枚举快速入门教程

《Rust中的Option枚举快速入门教程》Rust中的Option枚举用于表示可能不存在的值,提供了多种方法来处理这些值,避免了空指针异常,文章介绍了Option的定义、常见方法、使用场景以及注意事... 目录引言Option介绍Option的常见方法Option使用场景场景一:函数返回可能不存在的值场景

Python中异常类型ValueError使用方法与场景

《Python中异常类型ValueError使用方法与场景》:本文主要介绍Python中的ValueError异常类型,它在处理不合适的值时抛出,并提供如何有效使用ValueError的建议,文中... 目录前言什么是 ValueError?什么时候会用到 ValueError?场景 1: 转换数据类型场景

C# dynamic类型使用详解

《C#dynamic类型使用详解》C#中的dynamic类型允许在运行时确定对象的类型和成员,跳过编译时类型检查,适用于处理未知类型的对象或与动态语言互操作,dynamic支持动态成员解析、添加和删... 目录简介dynamic 的定义dynamic 的使用动态类型赋值访问成员动态方法调用dynamic 的

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]