2016-04-12 2 views
1

С приведенным ниже кодом я могу запустить HTTP-запрос на свой сервер и получить объект JSON благодаря Alamofire и Swiftyjson.Alamofire/Swiftyjson - передать тип JSON делегату протокола Objc

Но я не могу передать пользовательский класс JSON из Swiftyjson в качестве аргумента метода моего делегата.

Что мне делать, чтобы исправить эту ошибку?

строка кода с ошибкой:

optional func didReceiveUserInfo(userInfo: JSON) //This the line I get the error 

Ошибка: метод не может быть членом @objc протокола, так как тип параметра не может быть представлена ​​в в Objective-C

Вот полный код, который я использую:

import UIKit 
import Alamofire 
import SwiftyJSON 

@objc protocol UserModelDelegate { 
    optional func didReceiveUserInfo(userInfo: JSON) //This is the line I get the error 
} 

class UserModel: NSObject, NSURLSessionDelegate { 

    // Instantiate the delegate 
    var delegate: UserModelDelegate? 

    override init() { 
     super.init() 
    } 

    func getUserInfo(token: String) { 

     let url = "http://test.app/api/userInfo" 

     let headers = [ 
      "Authorization":"Bearer \(token)", 
      "Content-Type": "application/x-www-form-urlencoded" 
     ] 

     Alamofire.request(.GET, url, headers: headers).responseJSON { response in 

      switch response.result { 

       case .Success(let data): 
        let json = JSON(data) 
        self.delegate?.didReceiveUserInfo?(json) //This is where I pass the JSON custom class type as an argument 

       case .Failure(let error): 
       print("Request failed with error: \(error)") 
      } 
     } 
    } 
} 

ответ

0

Вот код рабочий:

import UIKit 
import Alamofire 
import SwiftyJSON 

protocol UserModelDelegate { 

    func didReceiveUserInfo(userInfo: JSON) 

} 

class UserModel: NSObject { 

    // Instantiate the delegate 
    var delegate: UserModelDelegate? 

    override init() { 

     super.init() 

    } 

    func getUserInfo(token: String) { 

     let url = "http://test.app/api/userInfo" 

     let headers = [ 
      "Authorization":"Bearer \(token)", 
      "Content-Type": "application/x-www-form-urlencoded" 
     ] 


     Alamofire.request(.GET, url, headers: headers).responseJSON { response in 
     switch response.result { 
      case .Success(let data): 

       if (data as? [String:AnyObject])!["error"] == nil { 

        let json = JSON(data)     

        self.delegate?.didReceiveUserInfo(json) 

       } else { 

        self.delegate?.didReceiveUserInfo(nil) 

       } 
      case .Failure(let error): 
       print("Request failed with error: \(error)") 
      } 
     } 
    } 
} 
+0

Я рекомендую вам изменить свой делегат 'var: UserModelDelegate?' На 'слабый делегат var: UserModelDelegate? ', Чтобы избежать циклов сохранения. – bitsoverflow

0

Я бы, скорее всего, установил, что требования к протоколу не являются необязательными, в этом случае будет иметь смысл делать это, как ваш делегат имеет одно требование. Проблема, с которой вы сталкиваетесь, состоит в том, что вам нужен тип объекта JSON для совместимости с Objective-C. Вы можете сделать это, наследуя класс от класса Objective-C (например, NSObject). Еще одна вещь, которую вы должны сделать, это объявить свойство delegate в UserModel a weak, чтобы избежать удержания циклов.

Edit: Пример того, как сделать быстр класс совместит с Objective-C:

class JSON: NSObject { 
//the code 
} 

Примечания: Я ранее заявлял, что вам нужно добавить @objc атрибута к классу. Это фактически не обязательно, если вы не хотите, чтобы ваш класс был видимым с другим именем в Objective-C.

Для получения дополнительной информации о взаимодействии Swift и Objective-C read here.

+0

Спасибо за ваш ответ. Дело в том, что я хотел бы получить второе требование в случае отказа запроса. Не забудьте понять свой ответ о том, как наследовать класс класса Objective-C и добавить атрибут @objc. Как это сделать? Извините, я довольно новичок в разработке iOS. – sbkl

+0

@sbkl Я добавил больше информации в свой ответ. – bitsoverflow

+0

@sbkl также обратите внимание, что вы можете сделать свое требование протокола необязательным и использовать реализацию по умолчанию, если пользователь не хочет реализовывать его с использованием расширений протокола. Подробнее об этом здесь: https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html#//apple_ref/doc/uid/TP40014097-CH25-ID521 – bitsoverflow

Смежные вопросы