rus*_*elf 34 objective-c variadic-functions swift
假设我在Objective-c中有一个类,其静态方法如下:
+ (NSError *)executeUpdateQuery:(NSString *)query, ...;
Run Code Online (Sandbox Code Playgroud)
我如何从Swift中调用它?自动完成功能无法识别它,编译器对以下内容不满意:
MyClassName.executeUpdateQuery("")
Run Code Online (Sandbox Code Playgroud)
抱怨'MyClassName.Type没有名为executeUpdateQuery的成员'
Sim*_*mon 48
写一个variadic方法的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;
}
Run Code Online (Sandbox Code Playgroud)
然后可以从Swift调用它
MyClassName.executeUpdateQuery("query %d, %d %d", args: getVaList([1,2,3,4]))
Run Code Online (Sandbox Code Playgroud)
添加扩展以支持本机Swift可变参数:
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)
Run Code Online (Sandbox Code Playgroud)
小心,Swift不提供NS_FORMAT_FUNCTION警告(-Wformat)
MyClassName.executeUpdateQuery("query %@", 99)
Run Code Online (Sandbox Code Playgroud)
CVArgType在Swift中本地呈现C"varargs"API很有用.(Swift Docs)
如果你有
+ (int)f1:(int)n, ...;
Run Code Online (Sandbox Code Playgroud)
你首先需要制作一个va_list版本:
+ (int)f2:(int)n withArguments:(va_list)arguments
Run Code Online (Sandbox Code Playgroud)
通过从可变参数版本调用va_list版本,可以在不重复代码的情况下完成此操作.如果您没有编写原始的可变参数函数,则可能无法实现(在本参考中进行了解释).
一旦你有了这个方法,就可以编写这个Swift包装器:
func swiftF1(x: Int, _ arguments: CVarArgType...) -> Int {
return withVaList(arguments) { YourClassName.f2(x, withArguments :$0) }
}
Run Code Online (Sandbox Code Playgroud)
注意省略的外部参数名称(_之前arguments),这使得调用语法swiftF1就像普通的C可变参数函数一样:
swiftF1(2, some, "other", arguments)
Run Code Online (Sandbox Code Playgroud)
另请注意,此示例不使用,getVaList因为文档说它"最好避免".
如果需要,您可以进一步将此函数放在原始类的Swift扩展中.
| 归档时间: |
|
| 查看次数: |
9906 次 |
| 最近记录: |