2016-06-21 41 views
0

私はiOSには新しく、見つけたライブラリを元のものに変換することで、Swift(そしてObjective Cのビット)の学習に取り組んでいます。これまでのところ、私は大丈夫ですが、1つの部分を理解することに問題があります。ここで#defineはSwiftでどのように機能しますか?

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

を、それはより多くのコンテキストである:どのようにこの#define動作するようになっている

#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

パーフェクト。ありがとうございました! –

関連する問題