Witam, mam działający kod parsujący json dla Swift2.2, ale kiedy używam go dla Swift 3.0, wyświetla mi ten błąd
ViewController.swift: 132: 31: Niejednoznaczne odwołanie do elementu członkowskiego „dataTask (with: CompleteHandler :)”
Moje kody tutaj
let listUrlString = "http://bla.com?batchSize=" + String(batchSize) + "&fromIndex=" + String(fromIndex)
let myUrl = URL(string: listUrlString);
let request = NSMutableURLRequest(url:myUrl!);
request.httpMethod = "GET";
let task = URLSession.shared().dataTask(with: request) {
data, response, error in
if error != nil {
print(error!.localizedDescription)
DispatchQueue.main.sync(execute: {
AWLoader.hide()
})
return
}
do {
let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSArray
if let parseJSON = json {
var items = self.categoryList
items.append(contentsOf: parseJSON as! [String])
if self.fromIndex < items.count {
self.categoryList = items
self.fromIndex = items.count
DispatchQueue.main.async(execute: {
self.categoriesTableView.reloadData()
AWLoader.hide()
})
}else if( self.fromIndex == items.count){
DispatchQueue.main.async(execute: {
AWLoader.hide()
})
}
}
} catch {
AWLoader.hide()
print(error)
}
}
task.resume()
Dzięki za pomysły.
dataTask(with:
np., Który miałemurl = "www.yahoo.com
i przekazywałem go bezpośrednio do funkcji bez konwertowania go na aURL
Odpowiedzi:
Kompilator jest zdezorientowany sygnaturą funkcji. Możesz to naprawić w ten sposób:
Ale pamiętaj, że nie musimy rzucać „request” jak
URLRequest
w tym podpisie, jeśli zostało zadeklarowane wcześniej jakoURLRequest
zamiastNSMutableURLRequest
:To jest automatyczne rzucanie między
NSMutableURLRequest
a nowym,URLRequest
które zawodzi i które zmusiło nas do zrobienia tego tutaj.źródło
var request = URLRequest(url:myUrl!)
URL(string:)
konstruktor może kiedykolwiek zawieść?Masz init'd
myRequest
jakNSMutableURLRequest
trzeba to:Szybki porzuca obie
NSMutable...
rzeczy. Po prostu użyjvar
dla nowych klas.źródło
Xcode 8 i Swift 3.0
Korzystanie z sesji URL:
Połączenie delegata URLSession:
Korzystanie z bloku GET / POST / PUT / DELETE:
Działa dobrze dla mnie ... spróbuj 100% gwarancji wyniku
źródło
Ten problem jest spowodowany tym, że URLSession ma dwie metody dataTask
Pierwsza ma
URLRequest
jako parametr, a druga maURL
jako parametr, więc musimy określić, jaki typ wywołać, na przykład chcę wywołać drugą metodęźródło
W moim przypadku błąd był w NSURL
W Swift 3 musisz wpisać tylko adres URL :
źródło
Przetestowana stabilna wersja xcode 8; Musisz użyć
var request
zmiennej zURLRequest()
tym, możesz łatwo to naprawić ( błąd )var request = URLRequest(url:myUrl!)
IDziała dobrze! Dziękuję wam, myślę, że pomogę wielu ludziom. !
źródło
var request = URLRequest(url: url); let task = URLSession.shared().dataTask(with: request) { ... }
shared
jest raczej właściwością niż funkcją w języku Swift 3 (bez nawiasów).Dla Swift 3 i Xcode 8:
// Uwaga: zawsze możesz użyć debugera, aby sprawdzić błąd
źródło
W swift 3 kompilator jest zdezorientowany sygnaturą funkcji. Określenie go usunie błąd. Przekonwertuj również ciąg adresu URL na typ URL. Poniższy kod zadziałał dla mnie.
źródło
Krótka i zwięzła odpowiedź dla Swift 3:
źródło
źródło
Aby załadować dane za pomocą żądania GET, nie potrzebujesz żadnych
URLRequest
(ani średników)źródło
źródło
Xcode 10.1 Swift 4
To zadziałało dla mnie:
Klucz był dodawany w
URLSessionDataTask
deklaracji typu.źródło
Robię to, aby znaleźć
Nie można użyć
źródło