当程序开始运行时,编译器会先将代码中的MAX全部替换为100,然后再进行编译。由此可得,#define并不是在编译过程中进行,而是在预编译阶段进行。...关于typedef定义枚举官方API是这样说的 /* NS_ENUM supports the use of one or two arguments....NSInteger类型来制定枚举的值类型,第二个参数是可选的枚举类型的别名,如果要定义别名,必须使用typedef进行定义,具体格式如下: typedef NS_ENUM(NSInteger, NSComparisonResult...double J=PI; //再进行宏替换,又一次分配内存 double j=Pi; //没有内存分配 const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数...typedef是类型替换,语句的一种,结尾必须有; define写在方法/函数中则作用域从写的地方开始有效,直至使用#undef(不写此指令则后面一直有效)。
占的只是代码段而已,大量用宏会导致二进制文件变大 但#define可以使用类型定义,比如 #define MY_INT_CONSTANT ((int)123) const const定义常量从汇编的角度来看...如何选择 尽量选择使用const,因为编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率比宏定义要高。...相反,define占据更多的内存空间,因为它只是文字替换,导致存在过多的拷贝。当然这一点是对于一般类型的常量来说的。...使用 NS_ENUM 宏定义枚举数据,其内容的值都是互斥的: typedef NS_ENUM(NSInteger, UITableViewCellStyle) { UITableViewCellStyleDefault...宏不仅定义了枚举的名称(UITableViewCellStyle),还定义了类型(NSInteger),一般来说枚举的类型是 NSInteger。
更多信息请看使用Xcode重构你的代码。 Enumeration Macros NS_ENUM和NS_OPTIONS宏提供一个简洁、简单的定义枚举的方法和基于c语言的选项。...这些宏在Xcode中实现可以显式地指定枚举类型和选项的大小。此外,这种由旧的编译器语法声明枚举的方式,可以被新的编译器正确评估和解释潜在的类型信息。...---- 使用NS_ENUM宏定义枚举,互斥的一组值: typedef NS_ENUM(NSInteger, UITableViewCellStyle){ UITableViewCellStyleDefault...宏帮助定义枚举的名称和类型,在本例中名称为UITableViewCellStyle类型为NSInteger。...枚举类型应该是NSInteger。
,可以设置一个风格和标识符,风格的枚举如下: typedef NS_ENUM(NSInteger, UITableViewCellStyle) { UITableViewCellStyleDefault...cell将要显示时,会调用这个方法,这个方法最大的用武之地是当你自定义的cell上面有图片时,如果产生了重用,图片可能会错乱(当图片来自异步下载时及其明显),这时我们可以重写这个方法把内容抹掉。...@property (nonatomic) UITableViewCellSelectionStyle selectionStyle; cell被选中时的风格,枚举如下: typedef NS_ENUM...,枚举如下 typedef NS_ENUM(NSInteger, UITableViewCellEditingStyle) { UITableViewCellEditingStyleNone,/...(cell最右侧显示的视图) 枚举如下: typedef NS_ENUM(NSInteger, UITableViewCellAccessoryType) { UITableViewCellAccessoryNone
枚举只是一种常量命名方式 某种状态值可以使用枚举 typedef NS_ENUM(NSInteger,LoginState){ LoginStateSuccess, LoginStateFail..., }; 在定义选项的时候,若这些选项可以彼此组合,各个选项之间可以通过按“按位或操作符”来组合,那么枚举值中可定义为2的幂 typedef NS_ENUM(NSInteger, UIInterfaceOrientation...return UIInterfaceOrientationLandscapeLeft | UIInterfaceOrientationLandscapeRight; } 在switch中使用枚举来定义状态机...,最好不要用default,如果使用default,当枚举中添加一个值,编译器不会发出警告,但是switch中不加default,编译器会有警告提示信息 typedef NS_ENUM(NSInteger...多个选项可以同时存在,可以使用枚举类型,可以将各选项值定义为2的幂,以便通过按位或操作将其组合 3.处理switch语句中不要带有default分支,这样加入新枚举值之后,编译器会提示开发者 参考
,可以使用%@,%d等等格式化字符来在运行时替换为变量的实际值。...1.先来看NSComparisonPredicate类 这个类是NSPredicate的子类,其用来创建比较类型的谓词。...,枚举如下: typedef NS_ENUM(NSUInteger, NSComparisonPredicateModifier) { NSDirectPredicateModifier = 0...NSAnyPredicateModifier //同于数组或集合 当内部有一个元素满足时 集合算通过验证 }; 关于NSAllPredicateModifier和NSAnyPredicateModifier,这两个枚举专门用于数组或集合类型对象的验证...filteredArrayUsingPredicate:pre]; //将打印@[@[@"ccccc",@"ccccc"]] NSLog(@"%@",result); NSPredicateOperatorType枚举用来设置运算符类型
NS_ENUM(NSUInteger, MKMapType) { MKMapTypeStandard = 0,//标准式的行政地图(会显示城市,街道等) MKMapTypeSatellite...注意:MKCoordinateSpan的显示范围是取决于大的一边的,比如如果我们这样写: MKCoordinateSpanMake(1.8, 360); 最后依然会显示整个世界地图。...,当显示用户位置设置为YES,这个方法也设置了后,地图框架为我们直接集成了定位,地图上就会显示我们的位置,模式的枚举如下: typedef NS_ENUM(NSInteger, MKUserTrackingMode...,MKAnnotationViewDragState的枚举如下: typedef NS_ENUM(NSUInteger, MKAnnotationViewDragState) { MKAnnotationViewDragStateNone...备注:在iOS9中,地图类型的枚举又添加了两种: typedef NS_ENUM(NSUInteger, MKMapType) { MKMapTypeStandard = 0,//标准
2、整数类型有可选的UNSIGNED属性,表示不允许负值,这大致可以使正数的上限提高一倍。有符号和无符号类型使用相同的存储空间,有相同的性能,具体情况具体考虑。...但在MySQL4.1 以及更早版本只能使用"浮点运算"来实现DECIMAL的计算,这样可能会导致精度损失。...枚举列可以把一些不重复的字符串存储成一个预定义的集合。MySQL在存储枚举时非常紧凑,会根据列表值的数量压缩到一个或两个字节中。...绕过这种限制的方式是按照需要的顺序来定义枚举列,另外也可以在查询中使用FIELD()函数显式地指定排序顺序,但这会导致MySQL无法利用索引消除排序,如果定义时候就是按照字母顺序,就没有那么做的必要了。...4、由于MySQL把每个枚举值都保存为整数,并且必须进行查找才能转换为字符串,所以枚举列有一些开销,通常枚举列都比较小,所以开销还可以控制,在特定情况下,把CHAR/VARCHAR列与枚举列进行关联可能会直接比关联
优化部分 enum 建议使用 NS_ENUM 和 NS_OPTIONS 宏来定义枚举类型,参见官方的 Adopting Modern Objective-C 一文: //定义一个枚举 typedef...age 属性的类型:应避免使用基本类型,建议使用 Foundation 数据类型,对应关系如下: int -> NSInteger unsigned -> NSUInteger float -> CGFloat...(从设计上来说,这时候也可以拆分成两个独立的方法),它不应该用作阐明有多个参数,比如下面的: //错误,不要使用"and"来连接参数 (int)runModalForDirectory:(NSString...而快捷构造方法的返回值,建议为 instancetype,为保持一致性,init 方法和快捷构造方法的返回类型最好都用 instancetype。...这样做你的属性更容易修改正确,并且更好阅读。这在《禅与Objective-C编程艺术 >》里有介绍。而且习惯上修改某个属性的修饰符时,一般从属性名从右向左搜索需要修动的修饰符。
; 播放器背景颜色 @property (nonatomic, readonly) MPMoviePlaybackState playbackState; 播放器的当前播放状态,枚举定义如下: typedef...,枚举定义如下: typedef NS_OPTIONS(NSUInteger, MPMovieLoadState) { MPMovieLoadStateUnknown = 0,//...,枚举定义如下: typedef NS_ENUM(NSInteger, MPMovieScalingMode) { MPMovieScalingModeNone, // 无缩放 ...,枚举如下: typedef NS_ENUM(NSInteger, MPMovieSourceType) { MPMovieSourceTypeUnknown,//类型未知 MPMovieSourceTypeFile...,参数枚举如下,生成缩略图的数据回调在后面的通知中详说: typedef NS_ENUM(NSInteger, MPMovieTimeOption) { MPMovieTimeOptionNearestKeyFrame
1.传统枚举类型的缺陷 枚举类型是C/C++中用户自定义的构造类型,它是由用户定义的若干枚举常量的集合。枚举值对应整型数值,默认从0开始。比如定义一个描述性别的枚举类型。...Vegetables{Cucumber,Tomato,Pepper}; //编译报Tomato重定义错误 其中水果和蔬菜两个枚举类型中包含同名的Tomato枚举常量会导致编译错误。...(2)由于枚举类型被设计为常量数值的“别名”,所以枚举常量总是可以被隐式转换为整型,且用户无法为枚举常量定义类型。 (3)枚举常量占用存储空间以及符号性不确定。...C++标准规定C++枚举所基于的“基础类型”是由编译器来具体实现,这会导致枚举类型成员的基本类型存在不确定性问题,尤其是符号性问题,即。...可见不同编译器对枚举常量的整型类型的宽度和符号有着不同的实现。GNU C++会根据枚举数值的类型使用不同宽度和符号的整型,VC++则始终以有符号int来表示枚举常量。
方法 在方法签名中,应该在方法类型(-/+ 符号)之后有一个空格。在方法各个段之间应该也有一个空格(符合Apple的风格)。在参数之前应该包含一个具有描述性的关键字来描述参数。...请特别注意nil值不能传入NSArray和NSDictionary字面值,因为这样会导致crash。...现在SDK有一个宏NS_ENUM()来帮助和鼓励你使用固定的基本类型。...break; } 当在switch使用枚举类型时,’default’是不需要的。...,有些Apple的APIs记录垃圾值(garbage values)到错误参数(如果non-NULL),那么判断错误值会导致false负值和crash。
首先,Canlendar应用默认创建了几个类型的日历,用户也可以根据需要创建自定义的日历,如下图: ?...从图中可以看出,重要数据的管理类为EKEventStore,其他类都是用来描述对应的数据,下面会一一介绍。...,定义如下: typedef NS_ENUM(NSUInteger, EKEntityType) { EKEntityTypeEvent, // 日历类型 EKEntityTypeReminder.../ 对未来的事件也会产生影响 }; 五、EKSource类详解 首先,EKSource描述了,例如某些日历是系统默认创建的,用户没有权限进行修改或删除,某些日历是用户自定义创建的,还有些可能来自云端...)entityType; @end EKSourceType枚举如下: typedef NS_ENUM(NSInteger, EKSourceType) { EKSourceTypeLocal,
: //判断是否支持某个数据提供类型 /* UIImagePickerControllerSourceType枚举定义如下: typedef NS_ENUM(NSInteger, UIImagePickerControllerSourceType.../* 返回值为如下枚举: typedef NS_ENUM(NSInteger, UIImagePickerControllerCameraCaptureMode) { //照片模式 UIImagePickerControllerCameraCaptureModePhoto...,需要设置为系统定义的文件类型字符串数组 默认为kUTTypeImage @property(nonatomic,copy) NSArray...枚举如下: /* typedef NS_ENUM(NSInteger, UIImagePickerControllerQualityType) { UIImagePickerControllerQualityTypeHigh...editingInfo:(nullable NSDictionary *)editingInfo NS_DEPRECATED_IOS(2_0, 3_0); //相机录像或者从图库相册选择视频完成后触发的回调方法
' 2.十转八 十进制转换为八进制: >>> oct(9) '0o11' 3 十转十六 十进制转换为十六进制: >>> hex(15) '0xf' 4.字符串转字节 字符串转换为字节类型...如果参数是字符串,那么它可能包含符号和小数点。如果超出普通整数的表示范 围,一个长整数被返回。 >>> int('12',16) 18 11....值得注意,自定义的实例都可哈希: list, dict, set 等可变对象都不可哈希(unhashable): 30.打开文件 返回文件对象 mode 取值表: 31.查看对象类型...38.父子关系鉴定 第二个参数可为元组: 39.所有对象之根 object 是所有类的基类 40.一键查看对象所有方法 不带参数时返回当前范围内的变量、方法和定义的类型列表;带参数时返回参数...41.枚举对象 Python 的枚举对象 迭代 TestIter 类: 43.创建 range 迭代器 range(stop) range(start, stop[,step]) 生成一个不可变序列的迭代器
当我们试图根据某个成员变量的偏移位计算其在该对象内存空间位置时,就会需要将指针转换为整型进行计算。当计算出该变量的位置后(整型),就需要将其转换为指针类型。 整型和枚举类型相互转换。...// 枚举向整型转换 int a3 = reinterpret_cast(pv); // 无类型指针转整型 Temp* pTemp1 = reinterpret_cast<Temp...这个说明如上的写法也不会导致编译期间出现问题——但是这并不意味着这样的代码就是正确的——父子指针转换可能会导致运行期出错。这个问题我们会在之后讨论。我们先看下执行的结果。 ? ...它用于在存在继承关系的类指针之间转换。可以从派生类指针转为基类指针,也可以从基类指针转为派生类指针。...a2 = dynamic_cast(pv); // 无符号指针转整型 // Temp* pTemp1 = dynamic_cast(pv); // 无符号指针转其他指针
结构 ---- 结构与类类似,都是用户定义类型,都有数据成员和函数成员,但有两个最大的区别: 类是引用类型而结构是值类型 结构是隐式密封的 strcut StructName { MemberDeclarations...之前说了,结构是隐式密封的,因此 protected,internal,abstruct,virtual 修饰符不可使用。 与 Swift 类似,C# 中的简单预定义类型在实现方式上是使用结构类型。...枚举 ---- 枚举只有一个类型的成员: 命名的整数值常量。...Objective-C 的实现 NS_ENUM 和 NS_OPTIONS 类似。...注意: 枚举是一个独特的类型,比较不同类型的枚举对象会导致编译错误,即使他们的底层都是整数。
上面说的是整形类型的转换,如果是浮点数转换的话也会有两个问题: 1.将较大的浮点型转换为较小的浮点类型,精度降低(如果对精度不理解请看我的C++第一篇),值可能会超出目标类型的取值范围,这种情况下的值是不确定的...6.如果一个操作数为有符号的,另一个操作数是无符号的,且无符号操作数的级别比有符号操作数的级别高,则将有符号操作数转换为无符号操作数所属的类型。...7.否则,如果有符号类型可以表示无符号类型的所有可能取值,则将无符号操作数转换为有符号操作数所属的类型。 8.否则,将两个操作数都转换为有符号类型的无符号版本。...整形提升: 如果bool,char、short,包括它们有符号或无符号变型,以及枚举类型,可以使用在需要int或者unsigned int的表达式中。...传递参数时的转换 如果函数参数类型定义为double类型,但是传入的时int类型,这在C中会提示错误,但在C++中,C++会自动帮我我们转换为函数原型中定义的值,条件是两种都是算术类型。
,String使用长度属性length来计算字符串的长度 1.1 String转换为Number parseInt(string, 10) parseInt() 函数可解析一个字符串,从位置 0...1.2 String转Object 通过JSON.parse来完成,该注意的是JSON.parse遇到不可解析的字符串时,会抛出SyntaxError异常。 ?...不同点在于Null 表示为‘定义了但是值为空’,而Undefind 表示为'这里应该有一个值,但是还没有定义' 要注意的是,如果我们用typeof来判断null的类型,会判定为 Object 类型,...undefined无法转为数字,第一个调用返回NaN.第二个是null转为隐式转换为0所以是2 ,第三个是如果传入的参数是undefined会以默认值为准,所以是3 5.2 总结 不要对一个显式变量的赋值...通过Object.protptype.toString.call()截取字符串[object...]中间字符串来区分类型,去掉前后符号,比如 "[object Array]"就提取了array来判断,之前写的工具库有定义点我
宏中的语法引用。 语法引用是一个宏中的特殊符号,例如x或y:ty。这些符号表示被引用的代码片段,它们被称为“引用号”。在编译过程中,这些引用号需要被替换为具体的代码,然后才能生成最终的代码片段。...它还包含一些用于解析过程中的状态信息,如输入流中的位置和待解析的token流。 MatcherLoc枚举类型:该枚举定义了匹配位置的不同类型,如单个token、重复的token、任意token等。...SymbolAlreadyDefined:定义了符号已经被定义的错误,在单态化过程中如果遇到重复定义一个符号的情况,会抛出此错误。...CouldntDumpMonoStats:定义了无法转储单态化统计信息的错误,在单态化过程中如果遇到无法转储统计信息的情况,会抛出此错误。...验证属性是非常重要的,因为属性中的错误或无效配置可能会导致编译错误或不正确的行为。 该文件包含了一个名为 preprocess_attrs 的函数,它是属性预处理的入口点。
领取专属 10元无门槛券
手把手带您无忧上云