2016-04-12 84 views
1

使用下面的代碼,我可以啓動一個HTTP請求到我的服務器,並通過Alamofire和Swiftyjson檢索JSON對象。Alamofire/Swiftyjson - 將JSON類型傳遞給Objc協議代理

但我無法從Swiftyjson傳遞自定義類JSON作爲我的委託方法的參數。

我該怎麼辦才能解決這個錯誤?

,錯誤代碼行:

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 delegate:UserModelDelegate?'更改爲'weak var delegate:UserModelDelegate?'以避免保留週期。 – bitsoverflow

0

我很可能會令該協議要求不是可有可無的,在這種情況下,它會使總感覺作爲您的代理這樣做有一個單一的要求。您面臨的問題是因爲您需要將對象類型與Objective-C兼容。您可以通過使類從Objective-C類繼承(如NSObject)來實現此目的。 您應該做的另一件事是宣告delegate屬性UserModel一個weak之一,以避免保留週期。

編輯:如何作出快速的類的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