美文网首页
iOS 中的宏定义,常量,与枚举类型使用

iOS 中的宏定义,常量,与枚举类型使用

作者: Kingfu金富 | 来源:发表于2018-07-31 01:02 被阅读0次

开发过程中的经常需要使用一些全局的常量,便于方法之间的参数传递和类型确定等,经常使用到的有宏定义,const常量以及枚举等,我们经常使用宏定义来进行全局常量的定义,但是是不是所有的全局常量宏定义都是最好的选择呢?
宏定义是我们最经常使用的全局常量定义方法,使用非常便捷,在使用过程中需要注意以下事项:
1.宏定义是预编译处理,在程序开始编译之前就已经完成;
2.宏定义只是进行字符替换,并没有优先级限制,比如
#define add(x,y)x + y
在使用时如果使用了add(3,4)add(3,4),宏定义替换之后的结果是3+43+4=19,而不是(3+4)*(3+4) =49,一定要注意!!!
3.宏定义不做类型的语法检查,宏定义中宏的所有参数都是没有类型的,可能会存在重复定义的问题,如果重复定义了相同名称的宏,程序只是会给出警告,而不会影响编译,所以如果你定义了同名称两个宏,而替换方式不一样的话,是很难发现的。
4.宏定义不是变量定义,所以并不分配内存;
5.宏定义只是字符串替换,结尾不需要使用使用分号结束。

const是变量修饰符号,在定义全局变量的时候,应该优先考虑static加上const来替换宏定义常量,原因有以下几点:
1.当项目比较大的时候,过多的宏定义会使项目的编译变得缓慢;
2.const修饰变量在编译期间会进行语法检查,可以防止意外的类型错误,以及重复定义,可以使定义更加安全;
3.const修饰变量时,该变量不允许改变,可以防止常量被意外修改;
4.在需要使用的地方,只需要使用extern关键字扩大变量的作用域,使得变量的访问更加灵活。

对于const的使用,需要注意以下事项:
1.const修饰普通变量,表示该变量为常量,使用过程中不允许修改;
2.const修饰指针类变量;含有地址的变量时,以*分为左右两部分,左侧部分含有const修饰符号时,该地址内容不能改修;右侧部分还有const修饰时,该变量地址不能改变,如果两侧都有const修饰,则内存地址和地址内容都不可变;
3.const可以修饰形参,被修饰的参数在方法内部不能被修改;
4.被const修饰的变量的作用域,可以通过extern进行扩展,不需要进行初始化和分配空间,只是告诉编译起该变量会在其他地方进行定义。

对于互斥(不能同时具有两种状态)表示的多种整型变量,一般推荐使用NS_ENUM来表示,使用很简洁,也很方便。比如文本在竖直方向的对齐状态

typedef NS_ENUM(NSInteger, UIControlContentVerticalAlignment) {
    UIControlContentVerticalAlignmentCenter  = 0,
    UIControlContentVerticalAlignmentTop     = 1,
    UIControlContentVerticalAlignmentBottom  = 2,
    UIControlContentVerticalAlignmentFill    = 3,
};

这种表示的优点是可以将多种实用普通整型数字不易区分的状态,用易于区分的字符串表示,见名知意,不易出错,方便表示。但是这种表示方法的不足之处就是各种状态之间不能并存,但是有些时候我们需要使用多种状态同时存在,比如选择了一个通信录里的联系人需要获取的信息类型

typedef NS_OPTIONS(NSUInteger, APContactField)
{
    APContactFieldFirstName        = 1 << 0,
    APContactFieldLastName         = 1 << 1,
    APContactFieldCompany          = 1 << 2,
    APContactFieldPhones           = 1 << 3,
    APContactFieldEmails           = 1 << 4,
    APContactFieldPhoto            = 1 << 5,
    APContactFieldThumbnail        = 1 << 6,
    APContactFieldPhonesWithLabels = 1 << 7,
    APContactFieldCompositeName    = 1 << 8,
    APContactFieldAddresses        = 1 << 9,
    APContactFieldRecordID         = 1 << 10,
    APContactFieldCreationDate     = 1 << 11,
    APContactFieldModificationDate = 1 << 12,
    APContactFieldMiddleName       = 1 << 13,
    APContactFieldSocialProfiles   = 1 << 14,
    APContactFieldNote             = 1 << 15,
    APContactFieldLinkedRecordIDs  = 1 << 16,
    APContactFieldJobTitle         = 1 << 17,
    APContactFieldWebsites         = 1 << 18,
    APContactFieldBirthday         = 1 << 19,
    APContactFieldSource           = 1 << 20,
    APContactFieldRelatedPersons   = 1 << 21,
    APContactFieldEmailsWithLabels = 1 << 22,
    APContactFieldDefault          = APContactFieldFirstName | APContactFieldLastName |
                                     APContactFieldPhones | APContactFieldRecordID,
    APContactFieldAll              = 0xFFFFFFFF
};

如果你需要同时选定姓名和联系方式,只需要定义 _enums = APContactFieldFirstName|APContactFieldLastName|APContactFieldPhones就可以了,
那么问题来了,对于这种可以同时选择多个属性的枚举类型,如何确定某个枚举值(比如APContactFieldFirstName)是不是包含在选定枚举(比如_enums)中呢?
只需要将(APContactFieldFirstName)&(_enums)运算,如果其值为真,则包含,否则为假。

转iOS 中的宏定义,常量,与枚举类型使用

相关文章

  • iOS 中的宏定义,常量,与枚举类型使用

    开发过程中的经常需要使用一些全局的常量,便于方法之间的参数传递和类型确定等,经常使用到的有宏定义,const常量以...

  • 关于extern引出的问题

    问题 项目中在.mm文件中使用宏: 报错: 解析 iOS的常量声明与定义 iOS中声明常量 定义常量 这个是iOS...

  • 如何使用const修饰常量

    在程序中我们会经常的遇到一些常量是经常使用的,我们通常将他们定义成枚举类型 或 宏定义类型 再或是const常量 ...

  • 2-2 如何为元组中的每个元素命名, 提高程序可读性

    问题 大量使用索引,无法确切辨识内容 C语言解决方法1, 使用宏定义2, 使用枚举类型 解决办法 1, 定义常量 ...

  • 枚举类型笔记

    枚举类型定义常量的语法: enum是定义枚举类型关键字.当需要在程序中使用该常量时,可以使用Constants.C...

  • Java自学-类和对象 枚举类型

    枚举类型 步骤 1 : 预先定义的常量 枚举enum是一种特殊的类(还是类),使用枚举可以很方便的定义常量比如设计...

  • 一些小链接

    1、iOS 宏(define)与常量(const)的正确使用 iOS宏(define)与常量(const)的正确使...

  • iOS之规范1

    iOS之规范1 参考链接:参考1,参考2,参考3 枚举类型 枚举推荐使用NS_ENUM和NS_OPTIONS宏定义...

  • JSPatch的趟坑之路

    不能使用 宏/常量/枚举 (所以所有的自定义字体\颜色宏都得用原始值, 就连系统自带的枚举值都得用原始值)(自定义...

  • iOS编码规范

    常量 在常量的使用上,建议尽量使用类型常量,不要使用宏定义,不如要定义一个常量,推荐这样写: 而不是这样写: 变量...

网友评论

      本文标题:iOS 中的宏定义,常量,与枚举类型使用

      本文链接:https://www.haomeiwen.com/subject/dbtcvftx.html