gpt4 book ai didi

objective-c - 如何在 Objective-C 中创建可变参数方法

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

也许这对你们大多数人来说显然很简单,但是请你举一个例子,如何在 C 中创建类似的方法(在 Objective-C 中)和函数来创建像 NSString 的函数stringWithFormat:NSLog().

提醒一下:

[NSString stringWithFormat:@"example tekst %i %@ %.2f", 122, @"sth", 3.1415"];
NSLog(@"account ID %i email %@", accountID, email);

我想创建类似于 NSString 的方法 stringWithFormat:, NSURL - urlWithFormat

最佳答案

这些通常被称为“可变参数函数”(或称方法)。

要创建它,只需使用 , ...结束您的方法声明, 如

- (void)logMessage:(NSString *)message, ...;

此时您可能希望将其包装在 printf 中。类似的功能,因为从头开始实现其中一个是尝试,充其量。

- (void)logMessage:(NSString *)format, ... {
va_list args;
va_start(args, format);
NSLogv(format, args);
va_end(args);
}

注意 NSLogv 的使用而不是 NSLog ;考虑NSLog(NSString *, ...);NSLogv(NSString *, va_list); ,或者如果你想要一个字符串; initWithFormat:arguments:NSString * .


另一方面,如果您使用的不是字符串,而是类似

+ (NSArray *)arrayWithObjects:(id)object, ... NS_REQUIRES_NIL_TERMINATION;

事情变得容易多了。

在这种情况下,而不是 vprintf -style 函数,使用循环 args , 假设你走的时候是 id,然后像在任何循环中一样解析它们。

- (void)logMessage:(NSString *)format, ... {
va_list args;
va_start(args, format);

id arg = nil;
while ((arg = va_arg(args,id))) {
/// Do your thing with arg here
}

va_end(args);
}

当然,最后一个示例假定 va_args 列表是零终止的。

注意:为了完成这项工作,您可能必须包含 <stdarg.h> ;但是如果没记错的话,这会与 NSLogv 一起包含,这意味着它会通过“Foundation.h”,因此也包括“AppKit.h”和“Cocoa.h”以及其他一些方式而下降;所以这应该是开箱即用的。

关于objective-c - 如何在 Objective-C 中创建可变参数方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4804674/

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