您如何从Swift调用Objective-C可变参数方法? [英] How do you call an Objective-C variadic method from Swift?
问题描述
假设我在Objective-c中有一个带有这样的静态方法的类:
Supposing I have a class in Objective-c with a static method like this:
+ (NSError *)executeUpdateQuery:(NSString *)query, ...;
我怎么用Swift来称呼它?自动完成功能无法识别它,并且编译器对以下内容不满意:
How do I call that from Swift? The autocomplete doesn't recognise it, and the compiler is unhappy with:
MyClassName.executeUpdateQuery("")
抱怨"MyClassName.Type没有名为executeUpdateQuery的成员"
Complaining that 'MyClassName.Type does not have a member named executeUpdateQuery'
推荐答案
编写可变参数方法的va_list版本;
Write a va_list version of your variadic method;
+ (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调用它
This can then be called from Swift
MyClassName.executeUpdateQuery("query %d, %d %d", args: getVaList([1,2,3,4]))
添加扩展以支持本机Swift等参args:
Add an extension to support native Swift variadic args:
protocol CFormatFunction {
class func executeUpdateQuery(format: String, _ args: CVarArg...) -> NSError?
}
extension MyClassName : CFormatFunction {
class func executeUpdateQuery(format: String, _ args: CVarArg...) -> NSError?
{
return MyClassName.executeUpdateQuery(format, args:getVaList(args))
}
}
MyClassName.executeUpdateQuery("query %d %@ %.2f", 99, "Hello", 3.145)
请注意,Swift不提供NS_FORMAT_FUNCTION警告(-Wformat)
Be careful, Swift doesn't provide NS_FORMAT_FUNCTION warnings (-Wformat)
MyClassName.executeUpdateQuery("query %@", 99)
这篇关于您如何从Swift调用Objective-C可变参数方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!