您如何从Swift调用Objective-C可变参数方法? [英] How do you call an Objective-C variadic method from Swift?

查看:197
本文介绍了您如何从Swift调用Objective-C可变参数方法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆