2017-04-08 2 views
-2

Hallo Leute Ich weiß nicht, warum das Array Places seltsame Werte wie 0x6080004b3aa0 zurückgibt, anstatt meinen Titel, Koordinate und Untertitel aus meiner JSON-URL anzuzeigen. Danke für Ihre Hilfe!Seltsame Ergebnisse mit Parsing von JSON in Swift3

import MapKit 

@objc class Place: NSObject { 


    var title: String? 

    var coordinate: CLLocationCoordinate2D 
    var subtitle: String? 

    init(title:String,subtitle:String, coordinate:CLLocationCoordinate2D){ 

     self.title = title 
     self.coordinate = coordinate 
     self.subtitle = subtitle 

    } 

    static func getPlaces() -> [Place] { 
     guard let url = NSURL(string: "https://script.googleusercontent.com/macros/echo?user_content_key=Z-LfTMdhgAg_6SRd-iMucSyWu-LFBQO8MLxJZ6DPcL05Rtr3joCCypWD2l46qaegSpVpVINc1DLl5inoDOgGx3p3ANpY1AkGOJmA1Yb3SEsKFZqtv3DaNYcMrmhZHmUMWojr9NvTBuBLhyHCd5hHa1ZsYSbt7G4nMhEEDL32U4DxjO7V7yvmJPXJTBuCiTGh3rUPjpYM_V0PJJG7TIaKp4bydEiKBUZP6fpOyGJIhkmEGneM7ZIlWloTVbXmkjs15vHn8T7HCelqi-5f3gf3-sKiW3k6MDkf31SIMZH6H4k&lib=MbpKbbfePtAVndrs259dhPT7ROjQYJ8yx") else { return [] } 

     let request = NSMutableURLRequest(url: url as URL!) 
     var places = [Place]() 
     let task = URLSession.shared.dataTask(with: request as URLRequest) {data,response,error in 
      guard error == nil && data != nil else { 
       print ("Error:",error) 
       return 
      } 
      let httpStatus = response as? HTTPURLResponse 
      if httpStatus?.statusCode == 200 
      { if data?.count != 0 
      { 
       let responseString = try! JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! NSDictionary 


       let contacts = responseString["Sheet1"] as? [AnyObject] 

       for contact in contacts!{ 
        var places = [Place]() 
        let title = contact["name"] as! String 
        let subtitle = contact["description"] as? String 
        let latitude = contact["latitude"] as? Double ?? 0, longitude = contact["longitude"] as? Double ?? 0 


        let place = Place(title:title,subtitle:subtitle!,coordinate: CLLocationCoordinate2DMake(latitude, longitude)) 
        places.append(place) 
        print(latitude) 
        print(place) 
       } 
      } 
      else { 
       print("No data got from url") 
       } 

      } else { 
       print("error httpsatus code is:", httpStatus!.statusCode) 
      } 
     } 
     task.resume() 


    return places as [Place] 
    } 


} 

Ich denke, das Problem ist folgendes:

lassen Platz = Platz (Titel: Titel, Untertitel: Untertitel, koordinieren: CLLocationCoordinate2DMake (Breite, Länge))

Wenn I print(place) es gibt die seltsamen Ergebnisse zurück

+0

Soll ich diese Frage erneut als Duplikat markieren? Hast du die verlinkte Frage in deinem vorherigen gelesen? Es ist nicht mit der Swift-Version verwandt. Sie können in einer beliebigen Version von Swift keine Daten von einer Methode zurückgeben, die eine asynchrone Aufgabe enthält. Der Grund für das * seltsame * Druckergebnis ist, dass Ihre 'Place' Klasse keine' description' Eigenschaft hat, so dass Sie nur die Zeigeradresse erhalten. – vadian

+0

Tut mir leid, @vadian, aber ich habe genau das gleiche mit einem Plist versucht und es hat perfekt funktioniert, also warum sollte es nicht mit einem externen Json arbeiten? – Tom

+1

Noch einmal, 'DataTask' funktioniert ** asynchron ** – vadian

Antwort

0

Wenn Sie eine Klasse, die Unterklassen von NSObject machen Sie erstellen ein Objekt t Hut wird von einer Objective-c-Klasse unterstützt - was unter bestimmten Umständen sehr nützlich sein kann (am häufigsten ist es, wenn Sie Ihr Objekt aufnehmen und es als ein Bündel von Binärdaten archivieren wollen).

Ich vermute, dass in Ihrem Fall wahrscheinlich nicht/müssen NSObject Unterklasse sein/müssen.

Hier ist ein vereinfachtes Beispiel zu zeigen, was passiert:

Hier ist eine Klasse unterstützt von NSObject:

@objc class ObjCPlace: NSObject { 
    let name: String 
    init(name: String) { 
     self.name = name 
    } 
} 

Wenn Sie eine Instanz dieses Objekts zu erstellen und versuchen, Inhalte zu drucken - wie Sie gefunden haben , können Sie die Objekte ihre Lage im Speicher erhalten:

let testObjcPlace = ObjCPlace(name: "New York") 
print(testObjcPlace) 
// prints: 
// <__lldb_expr_310.ObjCPlace: 0x600000055060> 

auf Alternative zu print mitverwenden könnte, die einen detaillierteren Blick auf Ihrem Objekt bietet:

let testObjcPlace = ObjCPlace(name: "New York") 
dump(testObjcPlace) 
// Prints: 
// ▿ <__lldb_expr_310.ObjCPlace: 0x600000055060> #0 
// - super: NSObject 
// - name: "New York" 

Aber stattdessen eine NSObject Unterklasse zu machen, werden Sie wahrscheinlich wollen einfach nur eine Swift-Klasse machen (oder in diesem Beispiel eine Struktur einen Blick auf this question and answers Erläuterungen nehmen die Unterschiede)

struct Place { 
    let name: String 
    init(name: String) { 
     self.name = name 
    } 
} 

da dieses Objekt nicht ist Objective-c-Objekt, das Sie drucken und nutzen Sie die internen Eigenschaften gedruckt als auch verwenden können:

let testPlace = Place(name: "New York") 
print(testPlace) 
// Prints: 
// Place(name: "New York") 

Willkommen bei StackOverflow!

+0

Vielen Dank! Ich denke, ich habe es jetzt verstanden – Tom