gpt4 book ai didi

objective-c - Objective-C 中的枚举定义形式

转载 作者:IT老高 更新时间:2023-10-28 11:49:01 24 4
gpt4 key购买 nike

有什么区别

typedef enum {
...
} Name;

enum {
...
};
typedef NSUInteger Name;

?如果功能相同,那么第二种形式有什么用?这不是不必要的困惑吗?

最佳答案

enumC 一样古老,因此是 Objective-C 的一部分。它只是 int 类型的显式编码。它对于调试非常有用,大多数较新的编译器都可以基于它进行优化。 (你应该完全忽略)。它最有助于使您的代码更具可读性(对其他人,或在您 sleep 后对您自己)。

typedef enum {
...
} NameType ;

后面是

NameType name;

这通常是 typedef 的首选样式,

您的第二个示例将将 typedef 绑定(bind)到您要指定的值,该值应仅属于给定类型。

请注意,这不会阻止您执行

name = 10244; // some non-valid value not listed in the enumeration

但某些编译器在这种情况下可能会生成警告,


我今天遇到了 Apple 对以下内容的使用:

enum {
NSFetchedResultsChangeInsert = 1,
NSFetchedResultsChangeDelete = 2,
NSFetchedResultsChangeMove = 3,
NSFetchedResultsChangeUpdate = 4
};
typedef NSUInteger NSFetchedResultsChangeType;

他们这样做是因为他们真的希望 NSFetchedResultsChangeType 是他们定义为 NSUInteger 的类型。这个可以是一个int,但它也可以是别的东西。对于 1、2、3 和 4 的值,我们 与类型无关。但他们正在编码到不同的抽象级别,因为他们是工具提供者。

您永远不应该向 Apple 寻求编码风格提示。如果您看到一些看起来像是更清洁/更好的编码方式的东西,通常是这样。正如 Kevin 所说,API 稳定性对他们来说至关重要。


编辑(2013 年 1 月) 如果您有权访问 WWDC 2012 session 视频,您应该观看 Session 405 - Modern Objective-C 6:00-10:00 .在较新的编译器中讨论了一种新语法,该语法允许显式调整类型大小并将值与类型紧密结合。 (借用自 C++ 11)

enum NSFetchedResultsChangeType : NSUInteger {
NSFetchedResultsChangeInsert = 1,
NSFetchedResultsChangeDelete = 2,
NSFetchedResultsChangeMove = 3,
NSFetchedResultsChangeUpdate = 4
};

关于objective-c - Objective-C 中的枚举定义形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7421516/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com