iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Objective-Cconst常量的优雅使用方法
  • 167
分享到

Objective-Cconst常量的优雅使用方法

Objective-Cconst常量Objective-Cconst 2022-11-13 14:11:53 167人浏览 薄情痞子
摘要

目录正文Objective-C 的常量声明方式在 Objective-C 中使用 let 来声明常量正文 在编写代码时经常要使用常量,来替代 magic number。比较简单的做法

正文

在编写代码时经常要使用常量,来替代 magic number。比较简单的做法是通过预处理指令 #define 来实现。

#define ANIMATioN_DURATION 0.3 

上述预处理指令会在编译时的预处理阶段会将代码中 ANIMATION_DURATION 字符串替换为 0.3。这种定义常量的方式比较简便,但是存在两个问题:

  • 丢失了类型信息。
  • 若该预处理指令声明在头文件中,引入该头文件的代码,ANIMATION_DURATION 都会被替换,可能出现冲突。

Objective-C 的常量声明方式

幸运的是,Objective-C 中提供了 const 关键字,可以用来定义常量。const 关键字可以对变量加以限定,使其值不能被改变,在整个作用域中都保持固定。

const NSTimeInterval kAnimationDuration = 0.3;

这种方式定义的常量包含类型信息,且在编译时即可检查是否与其他常量出现冲突。如果试图修改由 const 修饰符所声明的变量,那么编译器就会报错。

如果常量仅在某个实现文件中使用,还应该加上 static 关键字,否则会被视为全局常量。若不使用 static,编译器会为它创建一个外部符号,若另一个编译单元中也声明了同名变量,就会报错。

static const NSTimeInterval kAnimationDuration = 0.3;

当一个变量同时使用了 staticconst,那么编译器并不会创建符号,而是会像 #define 预处理指令一样,把所有遇到的变量替换为常值。

有时候需要把一个常量暴露给外界使用,比如通知,此类常量需放在全局符号表中。可以使用 extern 关键字,在头文件中进行声明:

// .h
extern NSString * const AFNetworkingTaskDidResumeNotification;
// .m
NSString * const AFNetworkingTaskDidResumeNotification = @"com.alamofire.networking.task.resume";

该常量在头文件中声明,在实现文件中定义。需要注意的是 const 写在指针类型的右边意味着该指针的指向不可被改变,若写在左边意味着该指针指向的内容不可被改变。

按上述方式实现并定义后,在编译时生成目标文件时,编译器会在数据段为字符串分配存储空间。

Foundation 框架中,苹果为了兼容 c++ 中对 extern 的使用,提供了宏:

#if defined(__cplusplus)
#define FOUNDATION_EXTERN extern "C"
#else
#define FOUNDATION_EXTERN extern
#endif
#define FOUNDATION_EXPORT FOUNDATION_EXTERN
#define FOUNDATION_IMPORT FOUNDATION_EXTERN

一个 C++ 程序中可能包含其他语言编写的部分代码,同样,C++ 编写的代码片段也可能被用在其他语言编写的代码中。但是,不同语言编写的代码相互调用是困难的,更何况用同一种语言编写,使用不同编译器进行编译的情况。因为,不同语言或者同种语言在不同编译器上编译时,在注册变量,传递参数和参数在栈上的布局上可能存在差异。

为了使它们遵守统一规则,可以使用 extern 指定一个编译和链接规约。extern "C" 指令中的 C,表示的是一种编译和链接规约,而不是一种语言。C 表示符合 C 语言的编译和链接规约的任何语言。

还要说明的是,extern "C" 指令指定的编译和链接规约,不会影响语义,只是改变编译和链接的方式。

FOUNDATION_EXPORTFOUNDATION_IMPORT 是用来兼容 Win32 应用程序的,移动端开发可以忽略。

所以上述对全局常量的声明,可以写成:

// .h
FOUNDATION_EXPORT NSString * const AFNetworkingTaskDidResumeNotification;
// .m
NSString * const AFNetworkingTaskDidResumeNotification = @"com.alamofire.networking.task.resume";

在 Objective-C 中使用 let 来声明常量

使用过 Swift 的同学,一定对其声明常量的方式的简洁性印象深刻,在 Swift 中声明常量的方式如下所示:

let kAnimationDuration = 0.3

之所以能如此简洁,是因为 Swift 具有 let 关键字和类型推断的能力,但其实在 Objective-C 中也可以通过类似的方式来书写常量。

Objective-C 中有一个关键字,是 __auto_type,可以实现类似 Swift 中类型推断能力的关键字,如下所示:

const __auto_type kAnimationDuration = 0.3;

可能对于简单的数据类型,这样的优势不是很明显,但是对于具有复杂泛型的类型来说,可以说优势很大了:

// 旧方式
NSArray<NSDictionary<NSString *, NSString *> *> *models = ...;
// 新方式
__auto_type models = ...;

同时,可以通过宏的方式,来减少 __auto_type 的书写,即可实现通过 let 声明常量,var 声明变量。其中 auto 关键字是为了兼容 C++。

#if defined(__cplusplus)
#define let auto const
#else
#define let const __auto_type
#endif
#if defined(__cplusplus)
#define var auto
#else
#define var __auto_type
#endif

声明了上面的宏之后,就可以直接使用了:

let kAnimationDuration = 0.3;

以上就是Objective-C const常量的优雅使用方法的详细内容,更多关于Objective-C const常量的资料请关注编程网其它相关文章!

--结束END--

本文标题: Objective-Cconst常量的优雅使用方法

本文链接: https://www.lsjlt.com/news/172079.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Objective-Cconst常量的优雅使用方法
    目录正文Objective-C 的常量声明方式在 Objective-C 中使用 let 来声明常量正文 在编写代码时经常要使用常量,来替代 magic number。比较简单的做法...
    99+
    2022-11-13
    Objective-C const常量 Objective-C const
  • Objective-C优雅使用KVO观察属性值变化
    目录引言KVOControllerYYCategories引言 KVO 是苹果为我们提供的一套强大的机制,用于观察属性值的变化,但是大家在日常开发中想必多少也感受到了使用上的一些不便...
    99+
    2022-11-13
    Objective-C KVO观察属性值 Objective-C KVO
  • node.js中优雅的使用Socket.IO模块的方法
    目录前言Socket.IO的定义Socket.IO的优点node中安装Socket.IOnode中使用Socket.IOemiton在express中引入使用服务端客户端小结前言 上...
    99+
    2022-12-08
    node.js使用Socket.IO模块 node.js Socket.IO
  • Python中优雅使用assert断言的方法实例
    目录什么是 assert 断言 断言和异常的使用场景 使用断言的几个原则建议不使用断言的情况:总结什么是 assert 断言 Assert statements are a co...
    99+
    2024-04-02
  • unplugin-svg-component优雅使用svg图标的方法是什么
    这篇文章主要介绍了unplugin-svg-component优雅使用svg图标的方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇unplugin-svg-component优雅使用svg图标的方法是什...
    99+
    2023-07-05
  • 怎么优雅的使用WebSocket
    这篇“怎么优雅的使用WebSocket”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么优雅的使用WebSocket”文章吧...
    99+
    2023-06-30
  • 怎么优雅的使用Linux
    这篇文章主要介绍怎么优雅的使用Linux,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Linux 的精髓只在于它的命令行CLI (Command LIne) 和远程登录。我们要牢记,Linux 是作为一个服务器系统和...
    99+
    2023-06-16
  • 怎么优雅的使用RabbitMQ
    本篇内容主要讲解“怎么优雅的使用RabbitMQ”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么优雅的使用RabbitMQ”吧! RabbitMQ无疑是目前...
    99+
    2024-04-02
  • 小程序中怎么优雅的捕捉异步方法的异常
    小编给大家分享一下小程序中怎么优雅的捕捉异步方法的异常,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!传统方法在ES7之后,我们往往使用 async await 语...
    99+
    2023-06-22
  • React Hook Form优雅处理表单使用的方法是什么
    这篇“React Hook Form优雅处理表单使用的方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看...
    99+
    2023-07-05
  • 使用 Python 异常处理,让你的代码更加优雅
    在 Python 中,异常处理机制是程序开发中非常重要的一部分。它可以帮助你捕获并处理运行时错误,从而防止程序崩溃。同时,异常处理机制也可以让你编写出更加健壮和可靠的代码。 在 Python 中,异常处理主要通过 try-except-...
    99+
    2024-02-25
    Python 异常处理 错误处理 try-except finally
  • 优雅使用GoFrame共享变量Context示例详解
    目录前言摘要Context是什么?为什么需要Context?Context是如何实现共享变量的?如何使用?一、结构定义介绍二、逻辑封装三、上下文变量注入四、上下文变量使用方法定义Co...
    99+
    2024-04-02
  • 常用的MySQL 优化方法
    数据库优化一方面是找出系统的瓶颈,提高MySQL数据库的整体性能,而另一方面需要合理的结构设计和参数调整,以提高用户的相应速度,同时还要尽可能的节约系统资源,以便让系统提供更大的负荷。   本文我们来...
    99+
    2023-09-02
    mysql 数据库 sql
  • 写优雅SQL原生语句的方法
    写优雅SQL原生语句的方法?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!前言:上一篇讲Mysql基本架构时,以"...
    99+
    2024-04-02
  • mysql优化通常使用的方法有哪些
    这期内容当中小编将会给大家带来有关mysql优化通常使用的方法有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。分享一下常见的几种MySQL数据优化方式。。。。。。。选...
    99+
    2024-04-02
  • JavaScript优雅处理对象的6种方法
    目录前言1、Object.freeze()2、Object.seal()3、Object.keys()4、Object.values()5、Object.create()6、Obje...
    99+
    2024-04-02
  • Java使用Optional实现优雅避免空指针异常
    目录摘要Optional 介绍Optional 使用创建 Optional 对象orElse()与orElseGet()map()与flatMap()filter()总结摘要 空指针...
    99+
    2023-03-21
    Java Optional空指针异常 Java Optional空指针 Java Optional
  • 优雅处理前端异常的几种方式推荐
    目录一、为什么要处理异常?二、需要处理哪些异常?三、处理异常的方式有哪些?1、try-catch2、window.onerror3、window.addEventListener4、...
    99+
    2022-11-13
    前端统一异常处理 前端异常处理 前端异常处理方案
  • js利用reduce方法让你的代码更加优雅
    前言 在实际项目中,最常见可能是在计算、循环逻辑方面的处理,可以使用数组中reduce方法也可以解决很多的问题,使得你的代码风格更加优雅! reduce语法 arr.reduce(...
    99+
    2024-04-02
  • SpringBoot实现优雅停机的正确方法
    目录一、介绍二、方案实践2.1 方法一 通过Actuator的Endpoint机制关闭服务2.2 方法二 使用ApplicationContext的close方法关闭服务2.3 方法...
    99+
    2023-01-30
    SpringBoot实现优雅停机 SpringBoot优雅停机 SpringBoot停机
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作