这个#define 在Swift 中是如何工作的?
How does this #define work in Swift?
我是 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
returns 出错,我们将所有内容传递给 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,您将使用可选的展开)。
所以请继续调用 completion
。
(似乎同样的推理也适用于 error
。你不会在那里遇到编译错误吗?)
(也可以考虑使用 Swift version of AlamoFire)。
我是 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
returns 出错,我们将所有内容传递给 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,您将使用可选的展开)。
所以请继续调用 completion
。
(似乎同样的推理也适用于 error
。你不会在那里遇到编译错误吗?)
(也可以考虑使用 Swift version of AlamoFire)。