假设我在 Objective-c 中有一个带有如下静态方法的类:
+ (NSError *)executeUpdateQuery:(NSString *)query, ...;
我如何从 Swift 中调用它?自动完成无法识别它,并且编译器不满意:
MyClassName.executeUpdateQuery("")
提示“MyClassName.Type 没有名为 executeUpdateQuery 的成员”
最佳答案
编写可变参数方法的 va_list 版本;
+ (NSError *)executeUpdateQuery:(NSString *)query, ...
{
va_list argp;
va_start(argp, query);
NSError *error = [MyClassName executeUpdateQuery: query args:argp];
va_end(argp);
return error;
}
+ (NSError *)executeUpdateQuery:(NSString *)query args:(va_list)args
{
NSLogv(query,args);
return nil;
}
然后可以从 Swift 调用它
MyClassName.executeUpdateQuery("query %d, %d %d", args: getVaList([1,2,3,4]))
添加扩展以支持原生 Swift 可变参数:
protocol CFormatFunction {
class func executeUpdateQuery(_ format: String, _ args: CVarArg...) -> NSError?
}
extension MyClassName : CFormatFunction {
class func executeUpdateQuery(_ format: String, _ args: CVarArg...) -> NSError?
{
return withVaList(args) { MyClassName.executeUpdateQuery(format, args: $0) }
}
}
MyClassName.executeUpdateQuery("query %d %@ %.2f", 99, "Hello", 3.145)
注意,Swift 不提供 NS_FORMAT_FUNCTION 警告(-Wformat)
MyClassName.executeUpdateQuery("query %@", 99)
关于objective-c - 你如何从 Swift 调用 Objective-C 可变参数方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33706250/