У меня возникает проблема, когда я пытаюсь сделать запрос к YQL для данных запаса, когда символ (newCompanyStockSymbol
) для поиска вводится пользователем , Принести запасы в этой функции:Как вставить значение в URL-адрес, чтобы сделать запрос к YQL
func handleSave() {
// Fetch stock price from symbol provided by user for new company
guard let newCompanyStockSymbol = stockTextField.text else {
print("error getting text from field")
return
}
var newCompanyStockPrice = ""
let url = URL(string: "https://query.yahooapis.com/v1/public/yql?q=select%20symbol%2C%20Ask%2C%20YearHigh%2C%20YearLow%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22\(newCompanyStockSymbol)%22)&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys")!
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
if error != nil {
print(error!)
} else if let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 {
let json = JSON(data: data!)
if let quotes = json["query"]["results"]["quote"].array {
for quote in quotes {
let ask = quote["Ask"].stringValue
newCompanyStockPrice = ask
}
}
print("new company json: \(json)")
}
guard let newCompanyName = self.nameTextField.text else {
print("error getting text from field")
return
}
guard let newCompanyLogo = self.logoTextField.text else {
print("error getting text from field")
return
}
print("2: The new commpany stock price is: \(newCompanyStockPrice)")
// Call save function in view controller to save new company to core data
self.viewController?.save(name: newCompanyName, logo: newCompanyLogo, stockPrice: newCompanyStockPrice)
self.viewController?.tableView.reloadData()
}
task.resume()
// Present reloaded view controller with new company added
let cc = UINavigationController()
let companyController = CompanyController()
viewController = companyController
cc.viewControllers = [companyController]
present(cc, animated: true, completion: nil)
}
И я использую интерполяцию строки для вставки \(newCompanyStockSymbol)
в запросе URL в соответствующем месте. Однако я получаю сообщение об ошибке и ошибке в этой строке, потому что он возвращает нуль, я ожидаю, потому что он использует URL-адрес с \(newCompanyStockSymbol)
там дословно, вместо фактического ввода значения.
Есть ли другой способ сделать это?
EDIT
И save
функция зрения контроллера, который вызывается из handleSave()
выше, если это полезно:
func save(name: String, logo: String, stockPrice: String) {
guard let appDelegate =
UIApplication.shared.delegate as? AppDelegate else {
return
}
let managedContext =
appDelegate.persistentContainer.viewContext
let entity =
NSEntityDescription.entity(forEntityName: "Company",
in: managedContext)!
let company = NSManagedObject(entity: entity,
insertInto: managedContext)
company.setValue(stockPrice, forKey: "stockPrice")
company.setValue(name, forKey: "name")
company.setValue(logo, forKey: "logo")
do {
try managedContext.save()
companies.append(company)
} catch let error as NSError {
print("Could not save. \(error), \(error.userInfo)")
}
tableView.reloadData()
}
Какая ошибка? – Callam
@Callam неожиданно обнаружил нуль при развертывании необязательного значения – d0xi45
, выделив строку 'let url'. И в моей консоли это показывает, что 'newCompanyStockPrice' по-прежнему является пустой строкой, хотя я пытался установить' ask' этой переменной – d0xi45