我在程序中的类中有以下函数:

    func getXMLForTrips(atStop: String, forRoute: Int, completionHandler: @escaping (String) -> Void) {
        let params = [api key, forRoute, atStop]

        Alamofire.request(apiURL, parameters: params).responseString { response in
            if let xmlData = response.result.value {
                completionHandler(xmlData)
            } else {
                completionHandler("Error")
            }
        }
    }

在类的In it()中,我试图这样调用它:
getXMLForTrips(atStop: stop, forRoute: route) { xmlData in
                    self.XMLString = xmlData
                }

编译时不会出错,但在执行init()之后,类的self.XMLString仍然为nil(由Xcode调试器和稍后由于nil值而崩溃的程序显示)。我看不出这不可行的原因。有人能看到我丢失了什么吗?

最佳答案

你不应该在类的初始值设定项中进行internet调用。在完成internet调用之前,您将到达init方法的返回,这意味着该类可能会使用您试图设置的变量的nil值初始化。
最好,您可以有另一个类,如API客户机、数据源或视图控制器,其中包含这些方法。我不确定使用init()方法的类被调用了什么,但假设它被调用了Trips

class Trips: NSObject {

  var xmlString: String

  init(withString xml: String) {
    xmlString = xml
  }

}

然后,一个选项是将另一个代码放在引用该对象的任何类中。
我将使用一个视图控制器作为例子,因为我不知道你在使用什么,因为你只展示了两个方法。
class ViewController: UIViewController {

  override func viewDidLoad() {
    super.viewDidLoad()
    //setting some fake variables as an example
    let stop = "Stop"
    let route = 3

    //just going to put that method call here for now
    getXMLForTrips(atStop: stop, forRoute: route) { xmlData in
      //initialize Trip object with our response string
      let trip = Trip(withString: xmlData)
    }
  }

  func getXMLForTrips(atStop: String, forRoute: Int, completionHandler: @escaping (String) -> Void) {
    let params = [api key, forRoute, atStop]
    Alamofire.request(apiURL, parameters: params).responseString { response in
      if let xmlData = response.result.value {
        completionHandler(xmlData)
      } else {
        completionHandler("Error")
      }
    }
  }

}

如果您希望能够在不需要设置xmlString变量的情况下初始化类,那么您仍然可以执行相同的操作。
将Trips classinit()方法更改为所需的任何值,并将其设置为var xmlString = ""或使其成为可选值:var xmlString: String?
在需要初始化的地方初始化类,然后在完成getXMLForTrips时,执行trip.xmlString = xmlData

10-08 01:45