2016-06-09 4 views
-4

Это часть кода, который был переведен:я использовал Swiftify преобразовать некоторые Obj C код для Swift и получил ошибки, которые я не знаю, как бороться с

Objective C:

[SPTRequest userInformationForUserInSession:session callback:^(NSError *error, SPTUser *user) { 
     if (error != nil) { 
      UIAlertView *view = [[UIAlertView alloc] initWithTitle:@"Getting User Info Failed" 
                  message:error.userInfo[NSLocalizedDescriptionKey] 
                  delegate:nil 
               cancelButtonTitle:@"OK" 
               otherButtonTitles:nil]; 
      [view show]; 
      return; 
     } 

Свифта:

1 SPTRequest.userInformationForUserInSession(session, callback: {(error: NSError, user: SPTUser) -> Void in 
2  if error != nil { 
3   var view: UIAlertView = UIAlertView(title: "Getting User Info Failed", message: error.userInfo[NSLocalizedDescriptionKey], delegate: nil, cancelButtonTitle: "OK", otherButtonTitles: "") 
4   view.show() 
5   return 
6  } 

Ошибки:

1: Cannot convert value of type '(NSError, SPTUser) -> Void' to expected argument type 'SPTRequestCallback!'

2: Value of type 'NSError' can never be nil, comparison isn't allowed

3: Cannot subscript a value of the type '[NSObject: AnyObject]' with an index of type 'String'

Что я больше всего смущен о том, как Objective C будет работать, но Свифт перевод не делает. Мой заголовок заголовка также настроен правильно.

Спасибо!

+1

Сообщения об ошибках выглядят очень четко. Первые два относятся к опциям и легко фиксируются. – matt

+0

@matt Я попробовал поставить их как опционные, и я все равно получаю те же ошибки. – user5812721

+0

@matt Итак, вставьте опцию после 'callback ?: ...' или '... return}?' – user5812721

ответ

4

Это должно выглядеть примерно так:

SPTRequest.userInformationForUserInSession(session) { error, user in 
    guard error == nil else { 
     let alert = UIAlertView(title: "Getting User Info Failed", message: error!.localizedDescription, delegate: nil, cancelButtonTitle: "OK", otherButtonTitles: "") 
     alert.show() 
     return 
    } 

    // carry on 
} 

Несколько наблюдений:

  1. Не беспокоить определения типов для error и user типов, и пусть это сделать вывод, что для вас.
  2. Я также использовал синтаксис закрывающего закрытия, который устраняет необходимость в параметре callback.
  3. Я также использовал guard, чтобы проверить наличие ошибок.
  4. Я бы использовал error.localizedDescription, а не пытался вытащить его из userDict. Это проще и интуитивно.

Как в стороне, в настоящее время мы будем использовать UIAlertController, а не UIAlertView. Кроме того, и, что более важно, все userInformationForUserInSession представляется устаревшим, поэтому я не уверен, что вы должны использовать этот метод вообще.

+1

Правильно. Все, что он делает, это плохая идея. (Не говоря уже о том, что этот API находится в бета-версии и не может делать IPv6, поэтому он не может использоваться в любом приложении для доставки.) Спасибо за то, что он тяжелый и указывающий на то, что мне этого не нужно. – matt

+0

@matt спасибо. Извините, я новичок в Swift и пытаюсь помочь другу с летним проектом. Я видел, как другие приложения используют этот SDK и корабль, я в замешательстве, почему это не будет отправлено. – user5812721

5

Не переводить рабски или механически. Подумайте о том, как работает код . Для того, чтобы error был nil, в Swift он должен быть необязательным. Но в вашем коде это не a Необязательно. Вам необходимо ввести error как NSError?, а не как NSError.

Я делаю ставку, что, если есть ошибка, SPTUser user будет nil. Но вы этого и не допустили. Вам нужно набрать это как SPTUser?, а не SPTUser.

(Вы, возможно, придется использовать восклицательные знаки вместо знаков вопроса здесь, все это зависит от того, как исходный API размечена Но попробуйте сначала с вопросительными знаками..)

Вы также можете быть запущен в неприятности потому что типы API user как id, то есть AnyObject.

Лучший способ начать работу, я думаю, чтобы позволить вам использовать метод типа Swift. Это компилируется нормально для меня:

SPTRequest.userInformationForUserInSession(session) { 
     (error, user) -> Void in 
     // 
    } 

Таким образом, error является NSError! и user является AnyObject!, автоматически. Теперь, конечно, вам нужно будет сбрасывать user до SPTUser, но вы можете пересечь этот мост, когда вы придете к нему.

+0

Я пробовал как «NSError?», Так и «NSError!». А также «SPTUser?» И «SPTUser!», Но я все равно получаю те же ошибки. – user5812721

+0

Отлично, что отлично работает. Тем не менее, я все еще получаю свою третью ошибку. – user5812721