How do you call an Objective-C variadic method from Swift?

前端 未结 3 516
无人共我
无人共我 2020-11-27 16:56

Supposing I have a class in Objective-c with a static method like this:

+ (NSError *)executeUpdateQuery:(NSString *)query, ...;

How do I ca

3条回答
  •  感情败类
    2020-11-27 17:38

    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;
    }
    

    This can then be called from Swift

    MyClassName.executeUpdateQuery("query %d, %d %d", args: getVaList([1,2,3,4]))
    

    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)
    

    Be careful, Swift doesn't provide NS_FORMAT_FUNCTION warnings (-Wformat)

    MyClassName.executeUpdateQuery("query %@", 99)
    

提交回复
热议问题