2016-01-27 67 views
0

我需要從格式字符串生成字符串的方法,它的內部NSArray的論點,但我我以前不覺得在StackOverflow的任何可行的解決方案。他們不建,也不拋出異常(firstsecond)。的NSString stringWithFormat和NSArray的

+0

這仍然是一個嚴重的措辭重複的問題。您應該添加你的答案到你提到的問題,理想的第一個一個... – Wain

+0

關閉,因爲https://stackoverflow.com/a/35089943/ –

回答

3

所以,我寫我的解決方案,我想與你分享。

@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:@"@%[email protected]:%zd", offsetReturnType, sizeptr]; 
    for (NSInteger i = 2; i < sumArgInvoke; i++) { 
     [mstring appendFormat:@"@%zd", sizeptr * i]; 
    } 
    return [NSMethodSignature signatureWithObjCTypes:[mstring UTF8String]]; 
} 

@end 
+0

'的NSNumber *麻木= arrayArguments的[I]'可以更通用,因爲你不知道它是一組數字。有趣的做法,雖然 – Wain

+0

對不起,我從我的項目中複製粘貼代碼...是的,它需要替換id(編輯) – ajjnix