我们今天有一些代码,它接受一个NSArray,并将它作为参数列表传递给-NSString initWithFormat:arguments,我们正在尝试让它与ARC一起工作。下面是我们使用的代码
NSString* format = @"Item %s and Item %s"; // Retrieved elsewhere
NSArray* args = [NSArray arrayWithObjects:@"1", @"2", nil]; // Retrieved elsewhere
// http://cocoawithlove.com/2009/05/variable-argument-lists-in-cocoa.html
char* argsList = (char*) malloc(sizeof(NSString*) * args.count);
[args getObjects:(id*) argsList];
NSString* message = [[[NSString alloc] initWithFormat:format arguments:argsList] autorelease];
free(argsList);
对如何使此ARC兼容有任何建议吗?或者我们甚至对更好的方法持开放态度。
发布于 2014-01-28 23:54:18
这仅适用于具有单个元素的数组
在我使用64位架构进行编译之前,克里斯科给出的答案运行得很好。这导致了一个错误:
EXC_BAD_ADDRESS类型EXC_I386_GPFLT
解决方案是使用一种稍微不同的方法将参数列表传递给该方法:
+ (id)stringWithFormat:(NSString *)format array:(NSArray*) arguments;
{
__unsafe_unretained id * argList = (__unsafe_unretained id *) calloc(1UL, sizeof(id) * arguments.count);
for (NSInteger i = 0; i < arguments.count; i++) {
argList[i] = arguments[i];
}
NSString* result = [[NSString alloc] initWithFormat:format, *argList] ;// arguments:(void *) argList];
free (argList);
return result;
}
发布于 2015-09-25 08:29:20
我找不到一种方法来做这个obj-c,但是一个快速的助手类最终让它工作了(我的整个项目都是obj-c,除了这个类)
@objc class StringFormat: NSObject {
class func format(key: String, args: [AnyObject]) -> String {
let locArgs: [CVarArgType] = args.map({ (arg: AnyObject) -> CVarArgType in
if let iArg = (arg is NSNumber ? arg.intValue : nil) {
return iArg
}
return arg as! CVarArgType
});
return String(format: key, arguments: locArgs)
}
}
有一些神奇的事情正在发生,这与[CVarArgType]
的行为不同于普通数组有关-但这是以您期望的灵活的跨架构方式工作的。
发布于 2017-02-09 19:08:06
在@mcfedr答案的基础上扩展,这个Swift 3帮助器完成了这项工作:
import Foundation
@objc (FTStringFormat) public class StringFormat: NSObject {
@objc public class func format(key: String, args: [AnyObject]) -> String {
let locArgs: [CVarArg] = args.flatMap({ (arg: AnyObject) -> CVarArg? in
if let arg = arg as? NSNumber {
return arg.intValue
}
if let arg = arg as? CustomStringConvertible {
return arg.description
}
return nil
});
return String(format: key, arguments: locArgs)
}
}
从Objective-C调用:
[FTStringFormat formatWithKey:@"name: %@ age: %d" args:@[@"John", @(42)]]
对于%@
格式说明符,我们使用Swift的CustomStringConvertible
协议,以便在所有数组成员上调用description
。
不可能支持所有的数字格式说明符,比如%d
和%f
,因为NSNumber
对象不能显示它是整数还是浮点数。所以我们只能支持一个或另一个。这里我们使用intValue
,所以支持%d
,但不支持%f
和%g
。
https://stackoverflow.com/questions/8273380
复制相似问题