gpt4 book ai didi

iphone - 如何为 "oneOf"编写函数或宏...在可变参数中进行转换?

转载 作者:行者123 更新时间:2023-11-28 19:24:32 26 4
gpt4 key购买 nike

注意 - 使用可变参数,Phix 在下面提供了一个 super 解决方案。但是,它会在与整数一起使用时给出编译器警告,因为您将它们转换为 id,并且它不适用于例如 float 。

问题——如何编写一个从列表中选择一项的工具?理想情况下,它会尽可能灵活关于类型的项目/对象/列表中的任何内容。

示例用法:

NSInteger openingMap = [utilities oneOf:1, 2, 3, 7, 8];

initialAngle =oneOf(1.25, 1.75, 1.95, 2.00, 2.01);

self.spaceShipNickName =oneOf(@"Blaster",@"Blitzen",@"Stardancer",@"Quantum");

self.chassisProperty = oneOf(titanium, neutronium, unavailablium);

[fireworksLayer paintStars:oneOf(blue,green,white) howMany:oneOf(20,25,50)];

[trump chooseDefaultSuite:oneOf(diamonds,hearts,clubs,spades)];

// normally have a few explosions, but, occasionally have a huge display...
explosionCount = oneOf( 2,2,2,3,4,1,28,3,3,3,70 );

请注意,一些示例是整数、一些枚举、一些 NSString 等。因此,如果一个工具能够处理不同的类型,那将是最令人印象深刻的。 (而不是一个相关的组,比如...... oneOfIntegers、oneOfStrings、oneOfObject 等等。)

不言而喻,要选择随机项目,只需使用...
= arcrandom() % 项目数

您可以使用Objective C 方法或类、c 函数或某种宏系统、NSMutableArray 的类别扩展,或者实际上是 block - 或其他任何东西。它应该尽可能灵活,以便在典型的 iOS 或 Mac 项目中的任何地方广泛使用……有什么想法吗?

最佳答案

#define NUMARGS(...)  (sizeof((id[]){__VA_ARGS__})/sizeof(id))
#define ONEOF(...) (oneOf(NUMARGS(__VA_ARGS__), __VA_ARGS__))

id oneOf(int numargs, ...) {
va_list ap;
va_start(ap,numargs);
int i = arc4random() % numargs;
id val = nil;
do {
val = va_arg(ap, id);
} while (i--);
va_end(ap);
return val;
}

用法:

NSLog(@"%@", ONEOF(@"Blaster",@"Blitzen",@"Stardancer",@"Quantum"));
NSLog(@"%d", ONEOF( 2,2,2,3,4,1,28,3,3,3,70 ));

请注意,两者都有效,但后者会抛出一些编译器警告。

关于iphone - 如何为 "oneOf"编写函数或宏...在可变参数中进行转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4920501/

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