2016-06-21 2 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, если вы не указали переменную как необязательную, она не может быть нулевой, поэтому вам не нужно выполнять эту проверку в Swift (и если она была необязательной, вы бы использовали необязательную разворачивание).

Так что просто позвоните completion.

(кажется то же самое рассуждение будет также применяться к error. Вы не получите ошибку компиляции там?)

(также рассмотреть вопрос об использовании Swift version of AlamoFire).

+0

Perfect. Спасибо! –