【问题标题】:NSString stringWithFormat and NSArray [duplicate]NSString stringWithFormat 和 NSArray [重复]
【发布时间】:2016-01-27 13:58:53
【问题描述】:

我需要一种从格式字符串生成字符串的方法,它是 NSArray 中的参数,但我没有在 StackOverflow 上找到任何可行的解决方案。他们不构建也不抛出异常(firstsecond)。

【问题讨论】:

  • 这仍然是一个措辞糟糕的重复问题。您应该将您的答案添加到您引用的一个问题上,最好是第一个......

标签: objective-c nsstring nsarray


【解决方案1】:

所以我写了我的解决方案,我想和你分享。

@implementation NSString (AX_NSString)

+ (instancetype)ax_stringWithFormat:(NSString *)format array:(NSArray *)arrayArguments {
    NSMethodSignature *methodSignature = [self ax_generateSignatureForArguments:arrayArguments];
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSignature];

    [invocation setTarget:self];
    [invocation setSelector:@selector(stringWithFormat:)];

    [invocation setArgument:&format atIndex:2];
    for (NSInteger i = 0; i < [arrayArguments count]; i++) {
        id obj = arrayArguments[i];
        [invocation setArgument:(&obj) atIndex:i+3];
    }

    [invocation invoke];

    __autoreleasing NSString *string;
    [invocation getReturnValue:&string];

    return string;
}

//https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html
+ (NSMethodSignature *)ax_generateSignatureForArguments:(NSArray *)arguments {
    NSInteger count = [arguments count];
    NSInteger sizeptr = sizeof(void *);
    NSInteger sumArgInvoke = count + 3; //self + _cmd + (NSString *)format
    NSInteger offsetReturnType = sumArgInvoke * sizeptr;

    NSMutableString *mstring = [[NSMutableString alloc] init];
    [mstring appendFormat:@"@%zd@0:%zd", offsetReturnType, sizeptr];
    for (NSInteger i = 2; i < sumArgInvoke; i++) {
        [mstring appendFormat:@"@%zd", sizeptr * i];
    }
    return [NSMethodSignature signatureWithObjCTypes:[mstring UTF8String]];
}

@end

【讨论】:

  • NSNumber *numb = arrayArguments[i]; 可以更通用,因为您不知道它是一个数字数组。有趣的方法
  • 对不起,我从我的项目中复制粘贴代码...是的,它需要替换为 id(编辑)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多