gpt4 book ai didi

用于检测变量是否为原始变量的 Objective-C 宏

转载 作者:太空狗 更新时间:2023-10-30 03:20:44 25 4
gpt4 key购买 nike

我正在寻找一个宏来检测变量是 Objective-C 中的对象还是原语。

在这种情况下,我知道参数必须是一个变量,永远不会是一个表达式。

这是我想到的最好的事情:

#define IS_OBJECT(x)    ( @encode(__typeof__(x))[0] == '@' )
#define IS_PRIMITIVE(x) ( !IS_OBJECT(x) )

用法:

NSString *testString = @"test";
NSString *nilString = nil;
NSInteger testInteger = 1;

STAssertTrue(IS_OBJECT(testString), @"IS_OBJECT(testString) must be YES");
STAssertTrue(IS_OBJECT(nilString), @"IS_OBJECT(nilString) must be YES");
STAssertFalse(IS_OBJECT(testInteger), @"IS_OBJECT(testInteger) must be NO");

一定有更好的方法。


更新

考虑到@ChrisDevereux 的评论,我更新了 IS_OBJECT 宏。

#define IS_OBJECT(x) ( strchr("@#", @encode(__typeof__(x))[0]) != NULL )

现在通过了:

NSString *testString = @"test";
NSString *nilString = nil;
NSInteger testInteger = 1;
Class classTest = [NSString class];

STAssertTrue(IS_OBJECT(testString), @"IS_OBJECT(testString) must be YES");
STAssertTrue(IS_OBJECT(nilString), @"IS_OBJECT(nilString) must be YES");
STAssertFalse(IS_OBJECT(testInteger), @"IS_OBJECT(testInteger) must be NO");
STAssertTrue(IS_OBJECT(classTest), @"IS_OBJECT(classTest) must be YES");

我仍然不喜欢这个答案,希望有更圆滑的东西。运行时库中是否有执行此操作的东西?

最佳答案

这是使用 C11 的 generic selection mechanism 的另一种方式. _Generic 是标准(现代)C 并在 clang 中支持了一段时间。

#define IS_OBJECT(T) _Generic( (T), id: YES, default: NO)

我觉得它有点不太像运行时,所以我更喜欢它而不是 @encode 方式。但老实说,我只是将它用于这个答案,因为我喜欢 _Generic 赋予宏的力量,并且认为更多的人应该开始使用它。如果您不知道,您应该阅读上面链接的 Robert Gamble 的文章。

关于用于检测变量是否为原始变量的 Objective-C 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14056674/

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