objective-c - 如何创建一个直接接受格式字符串作为参数的方法?

标签 objective-c string cocoa methods format

我不知道如何提出这个问题。 我想创建一个类似 stringWithFormat:predicateWithFormat: 的方法,即我的方法直接接受参数作为带有格式说明符的字符串。我怎样才能做到这一点?

例如,

-(void) someMethod: (NSString *)str, format; 

这样我以后可以这样调用它:

[someObject someMethod:@"String with format %@",anotherString];

这与任何特定上下文无关。

我正在使用类似于 predicateWithFormat 的代码:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like myName"];

这没有用,但是:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like 'myName'"];

工作方式类似于:

NSString *str = @"myName";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like %@",str];

所以这意味着该方法能够理解给定的参数是否在其中使用了格式说明符。我很好奇如何做到这一点?

最佳答案

使用可变参数宏 va_startva_end 等:

-(void) someMethod: (NSString *)fmt, ...
{
    va_list va;
    va_start(va, fmt);    
    NSString *string = [[NSString alloc] initWithFormat:fmt
                                              arguments:va];
    va_end(va);

    // Do thing with string
}

要记住的重要一点是,vararg 参数丢失了它们的类型,所以像 printf()[NSString stringWithFormat] 这样的函数使用格式字符串来帮助确定有多少参数有以及如何解释每一个。如果您需要不同的语义,那么您将需要以某种方式提供此信息。

关于objective-c - 如何创建一个直接接受格式字符串作为参数的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11329513/

相关文章:

iOS 使用刷新的身份验证 token 处理请求

objective-c - 更改 -observeValueForKeyPath :ofObject:change:context: 中的属性时,Cocoa 绑定(bind)不起作用

objective-c - Objective-C : Class Method Explanation

ios - 如何将 JSON 加载到 NSArray

ios - 如何在拖动时查找 View 是否触及另一个 View 的框架?

java - 如何清除单个字符串的不同部分,同时使结果成为字符串本身?

Javascript 在 Mac cocoa 应用程序中向 objective-c 发送消息

c# - 如何获取文本文件中同一字符串的最后两次出现 C#

java - 正则表达式拆分全名

macos - 如何以递归方式复制文件夹并提供进度反馈,同时保留 OS X 上的所有元数据?