objective-c - #define 在 Swift 中是如何工作的?

标签 objective-c swift variadic-functions

我是 iOS 的新手,我正在尝试通过将我找到的库转换为前者来解决学习 Swift(和一些 Objective C)的问题。到目前为止,我做的还不错,但有一部分难以理解; #define 应该如何工作:

#define RunSafeBlock(block, ...) block ? block(__VA_ARGS__) : nil

这里有更多上下文:

#import <AFNetworking.h>

// How would I write this in Swift?
#define RunSafeBlock(block, ...) block ? block(__VA_ARGS__) : nil

@interface Client ()
@end

@implementation Client
- (void)requestWithBodyBlock:(void (^)(id<AFMultipartFormData> formData))bodyBlock  completion:(ClientRequestCompletion)completion {
    [self validateAccessToken:^(NSError *error) {
        if (error) {
            // What does RunSafeBlock do?
            RunSafeBlock(completion, nil, error);
            return;
        }

        // ...
    }];
}
@end

AFNetworking 部分并不是真正相关的,但在这个例子中我们执行请求并验证访问 token 。如果 validateAccessToken 返回错误,我们将所有内容传递给 RunSafeBlock 并退出。我们在 Swift 中:

import AFNetworking

// #define RunSafeBlock(block, ...) block ? block(__VA_ARGS__) : nil

class Client {
    func requestWithBodyBlock(bodyBlock: (formData: AFMultipartFormData) -> Void, completion: ClientRequestCompletion) {
        self.validateAccessToken({(error: NSError) -> Void in
            if error != nil {
                // RunSafeBlock(completion, nil, error)
                return
            }

            // ...
        })
    }
}

我真的很感激一些指导。提前致谢!

最佳答案

这个宏正在做一个空检查。

在 Swift 中,除非您将变量声明为 Optional,否则它不能为 null,因此您不必在 Swift 中执行此检查(如果它是 Optional,您将使用可选展开)。

所以继续调用完成

(似乎同样的推理也适用于error。你不会在那里遇到编译错误吗?)

(也可以考虑使用 Swift version of AlamoFire )。

关于objective-c - #define 在 Swift 中是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37934161/

相关文章:

ios - 解析框架不断取消链接

swift - 如何从通用函数返回值作为协议(protocol)的实现?

c++ - 在可变参数函数内的不同参数包中推导出两个不同的已知类型变量

objective-c - 以编程方式从 Mac 钥匙串(keychain)存储和检索私钥

ios - 防止 UITableViewCells 出队和重新加载

ios - 如何在 UIAlertView 中容纳 8 个按钮

json - 无法使用 JSONDecoder 解码

ios - 解析 FQL 结果

c - 有没有一种在没有 stdarg.h 的情况下在 C 中实现可变参数的可移植方法?

具有无限数量参数的 Ruby 函数