2016-06-21 79 views
0

我是新來的iOS,並試圖通過將我找到的庫轉換爲前者來解決學習Swift(以及一些Objective C)。到目前爲止,我做得很好,但對於理解一部分有困難;這#define如何應該工作:這個#define如何在Swift中工作?

#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 
      } 

      // ... 
     }) 
    } 
} 

我真的很感激一些指導。提前致謝!

回答

4

該宏正在進行空檢查。在Swift中,除非你聲明一個變量爲Optional,否則它不能爲null,所以你不必在Swift中做這個檢查(如果它是可選的,你可以使用可選的解包)。

因此,請繼續前進並致電completion

(這似乎同樣的道理也適用於error,不要你得到一個編譯錯誤呢?)

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

+0

完美。謝謝! –

相關問題