objective-c - 你如何从 Swift 调用 Objective-C 可变参数方法?

标签 objective-c swift variadic-functions

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

相关文章:

c - 将 scanf 条目传递给 stdarg 函数

c - 如何保证可变参数的类型安全?

java - 如何将可变函数参数转换为 Set 或 List 等集合

ios - 如何通过点击使 UIView 移动?

objective-c - AirPrint 连接被拒绝错误

ios - 更改 NavigationController 中 UIButton 的颜色

ios - 根据各种屏幕尺寸自动布局 Collection View

ios - ios 的 swift 中带有 uitableview 的侧边栏菜单

ios - Swift 中的本地通知 ios

ios - SpriteKit 碰撞检测