简体   繁体   English

我不能使用委托和协议来传递数据

[英]I can't use Delegate and Protocol to pass data

I Learn Swift, I want to pass Json api data to viewController using delegate and protocol:我学习 Swift,我想使用委托和协议将 Json api 数据传递给 viewController:

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

in Model Class:在 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)
    }
}  }

In Dollar Struct:在美元结构中:

struct Dollar: Decodable{
var base: String }

when i execute this app, i can print: button1, button2, dollarValue.base + " a", dollarValue.base + " b", but i can't execute didRetriveDollar protocol in extension exchangeViewController .当我执行此应用程序时,我可以打印:button1、button2、dollarValue.base + " a"、dollarValue.base + " b",但我无法在扩展exchangeViewController中执行didRetriveDollar协议。

when i use Breakpoint, The program goes beyond delegate?.didRetriveDollarvalue(dollar: dollarValue) in model class. Can anyone find where is my wrong?当我使用 Breakpoint 时,程序超出了delegate?.didRetriveDollarvalue(dollar: dollarValue) in model class。有人能找到我错在哪里吗? Thank you I am sorry if my level in english isn't good enough.谢谢 如果我的英语水平不够好,我很抱歉。

It seems you are not setting your Exchange delegate correctly within your viewDidLoad method:看来您没有在viewDidLoad方法中正确设置Exchange委托:

exchange.delegate? = self

Try changing it to:尝试将其更改为:

exchange.delegate = self

for solve this error, I deleted "?"为了解决这个错误,我删除了“?” from exchange.delegate?来自exchange.delegate? = self, and i added: DispatchQueue.main.async {.....}. = self,我添加了:DispatchQueue.main.async {.....}。 This answer make the code work.这个答案使代码工作。 thank you谢谢你

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM