[英]I'm trying to use a protocol and delegate pattern which will pass the data in my array back to the parent view controller
[英]I can't use Delegate and Protocol to pass data
我学习 Swift,我想使用委托和协议将 Json api 数据传递给 viewController:
在视图控制器中:
class exchangeViewController: UIViewController {
var exchange = Exchange(baseUri: "http://data.fixer.io/api/latest?access_key=", apiKey: "apiKey")
@IBOutlet weak var inputEuro: UITextField!
@IBOutlet weak var getDollar: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
exchange.delegate? = self
}
@IBAction func exchangeCurrency(_ sender: UIButton) {
print("button1")
exchange.fitchData()
print("button2")
} }
extension exchangeViewController: ExchangeCurrencyDelegate {
func didRetriveDollarvalue(dollar: Dollar) {
print(dollar.base + " e1")
self.getDollar.text = dollar.base
print(dollar.base + " e2")
}
}
在 Model Class 中:
protocol ExchangeCurrencyDelegate{
func didRetriveDollarvalue(dollar: Dollar) }
class Exchange{
var delegate : ExchangeCurrencyDelegate?
var baseUri : String
var apiKey : String
init(baseUri: String, apiKey: String){
self.baseUri = baseUri
self.apiKey = apiKey
}
func fitchData(){
let url = URL(string: baseUri + apiKey)
let session = URLSession(configuration: .default)
let task = session.dataTask(with: url!, completionHandler: taskHandler(data:urlresponse:error:))
task.resume()
}
func taskHandler(data: Data?, urlresponse: URLResponse?, error: Error?) -> Void{
do {
let dollarValue:Dollar = try JSONDecoder().decode(Dollar.self, from: data!)
print(dollarValue.base + " a")
delegate?.didRetriveDollarvalue(dollar: dollarValue)
print(dollarValue.base + " b")
}
catch {
print(error)
}
} }
在美元结构中:
struct Dollar: Decodable{
var base: String }
当我执行此应用程序时,我可以打印:button1、button2、dollarValue.base + " a"、dollarValue.base + " b",但我无法在扩展exchangeViewController中执行didRetriveDollar协议。
当我使用 Breakpoint 时,程序超出了delegate?.didRetriveDollarvalue(dollar: dollarValue) in model class。有人能找到我错在哪里吗? 谢谢 如果我的英语水平不够好,我很抱歉。
看来您没有在viewDidLoad
方法中正确设置Exchange
委托:
exchange.delegate? = self
尝试将其更改为:
exchange.delegate = self
为了解决这个错误,我删除了“?” 来自exchange.delegate? = self,我添加了:DispatchQueue.main.async {.....}。 这个答案使代码工作。 谢谢你
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.