这个#define在Swift中是如何工作的?

时间:2016-06-21 01:18:24

标签: 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部分并不真正相关,但在此示例中,我们正在执行请求并验证访问令牌。如果validateAccessToken返回错误,我们会将所有内容传递给RunSafeBlock并退出。我们在斯威夫特:

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
            }

            // ...
        })
    }
}

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

1 个答案:

答案 0 :(得分:4)

这个宏正在进行空检查。

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

所以请继续拨打completion

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

(另请考虑使用Swift version of AlamoFire)。