use*_*500 36 enums objective-c ios
有什么区别
typedef enum {
...
} Name;
Run Code Online (Sandbox Code Playgroud)
和
enum {
...
};
typedef NSUInteger Name;
Run Code Online (Sandbox Code Playgroud)
?如果功能相同,那么第二种形式的优点是什么?这不是不必要的混乱吗?
bsh*_*ley 84
enum和它一样古老C,因此是其中的一部分Objective-C.它只是一种int类型的显式编码.它对调试非常有用,大多数新编译器都可以根据它进行优化.(你应该完全忽略).它最有用的是使你的代码更具可读性(对于任何其他人,或在你睡觉后对你自己).
typedef enum {
...
} NameType ;
Run Code Online (Sandbox Code Playgroud)
接下来会是
NameType name;
Run Code Online (Sandbox Code Playgroud)
这通常是typedef的首选样式,
您的第二个示例不会将typedef绑定到您要指定的值,只应该是给定的类型.
请注意,这不会阻止您执行
name = 10244; // some non-valid value not listed in the enumeration
Run Code Online (Sandbox Code Playgroud)
但在某些情况下,某些编译器可能会生成警告,
今天我遇到了Apple对以下内容的使用:
enum {
NSFetchedResultsChangeInsert = 1,
NSFetchedResultsChangeDelete = 2,
NSFetchedResultsChangeMove = 3,
NSFetchedResultsChangeUpdate = 4
};
typedef NSUInteger NSFetchedResultsChangeType;
Run Code Online (Sandbox Code Playgroud)
他们这样做是因为他们真的想要NSFetchedResultsChangeType成为他们定义的类型NSUInteger.这可以是一个,int但它也可以是其他东西.并且值为1,2,3和4,这与我们的类型有点无关.但是他们编码到不同的抽象层次,因为它们是工具提供者.
你永远不应该向Apple寻求编码风格的提示. 如果你看到的东西看起来更干净/更好的编码方式,通常是.正如Kevin所说,API稳定性对他们来说至关重要.
编辑(2013年1月)如果您有权访问WWDC 2012会话视频,则应该观看Session 405 - Modern Objective-C6:00-10:00.在较新的编译器中讨论了一种新语法,它允许显式调整类型大小并将值紧密绑定到类型.(借用C++ 11)
enum NSFetchedResultsChangeType : NSUInteger {
NSFetchedResultsChangeInsert = 1,
NSFetchedResultsChangeDelete = 2,
NSFetchedResultsChangeMove = 3,
NSFetchedResultsChangeUpdate = 4
};
Run Code Online (Sandbox Code Playgroud)
前者定义了一个类型名称来引用枚举.这是大多数枚举在C中命名的方式.后者虽然有点不同,但它在Cocoa框架中很流行.使用后者有两个原因.第一个是如果你的枚举定义了一个位域,你在这里想要它,因为当你提供一个"名称"值时,你将提供枚举值的组合.换句话说,如果你说的话
[self doSomethingWithBitfield:(Enum1 | Enum2)]
Run Code Online (Sandbox Code Playgroud)
你没有传递Name的值,而是传递一个两者组合的整数.
但是,Cocoa框架甚至对非位域值也使用这个习惯用法,原因很简单:API稳定性.根据C标准,枚举的底层整数类型需要能够包含枚举中的所有值,否则由编译器选择.这意味着添加新的枚举值可以改变枚举的整数类型(例如,添加-1可以使其签名,增加60亿可以使其成为长整数等).从API稳定性的角度来看,这是一件坏事,因为采用此枚举值的方法的类型编码可能会意外地更改并可能破坏现有代码和二进制文件.为了防止这种情况,Cocoa框架通常将类型定义为NSUInteger(如果需要负数,则为NSInteger),因此API和类型编码保持稳定.
| 归档时间: |
|
| 查看次数: |
49887 次 |
| 最近记录: |