![](/img/trans.png)
[英]iOS - Pass Data from Swift to ObjC VC using protocol and delegate
[英]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
)來實現。 您應該做的另一件事是將UserModel
的delegate
屬性聲明為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.