簡體   English   中英

Alamofire / Swiftyjson - 將JSON類型傳遞給Objc協議委托

[英]Alamofire/Swiftyjson - Pass JSON type to Objc protocol delegate

通過下面的代碼,我可以通過Alamofire和Swiftyjson向我的服務器發起HTTP請求並檢索JSON對象。

但我無法將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)")
            }
        }
    }
}

我可能會使協議要求不是可選的,在這種情況下,由於您的委托只有一個要求,所以這樣做是完全合理的。 您面臨的問題是因為您需要JSON對象類型與Objective-C兼容。 您可以通過使類繼承自Objective-C類(如NSObject )來實現。 您應該做的另一件事是將UserModeldelegate屬性聲明為weak屬性,以避免保留周期。

編輯:如何使swift類與Objective-C兼容的示例:

class JSON: NSObject {
//the code
}

注意:我之前曾聲明您需要在類中添加@objc屬性。 除非您想在Objective-C中使用其他名稱顯示您的類,否則實際上沒有必要。

有關Swift和Objective-C互操作性的更多信息, 請閱讀此處

這是代碼工作:

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)")
            }
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM