2017-04-08 82 views
-2

嗨,大家好,我不知道爲什麼數組位置返回奇怪的值,如0x6080004b3aa0而不是顯示我的標題,座標和字幕從我的JSON網址。謝謝你的幫助!奇怪的結果與解析數組從json在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] 
    } 


} 

我認爲這個問題是這樣的:

讓地方=廣場(標題:標題,副標題:字幕,座標:CLLocationCoordinate2DMake(緯度,經度))

當我print(place)它返回奇怪的結果

+0

我應該再次將此問題標記爲重複嗎?你有沒有讀過你之前的鏈接問題?它與Swift版本無關。你不能在任何版本的Swift中從包含異步任務的方法中返回一些東西。 *奇怪*打印結果的原因是你的'Place'類缺少'description'屬性,所以你只能得到指針地址。 – vadian

+0

我很抱歉@vadian,但我嘗試完全一樣的只是一個plist,它的工作完美,所以爲什麼不應該與外部json? – Tom

+1

'dataTask'再次異步** ** – vadian

回答

0

當您從NSObject子類從一個類創建一個對象t hat由一個Objective-c類支持 - 在某些情況下可以非常有用(最常見的用途是當你想把你的對象和歸檔爲一個二進制數據塊)。

我猜你在你的情況下,你可能不想/需要子類NSObject

這裏有一個簡單的例子來說明發生了什麼:

這是一個被NSObject支持類:

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

如果創建該對象的實例,並嘗試打印內容 - 您已經找到,你在內存中獲取對象的位置:

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

替代使用print可以使用dump,提供在你的對象的更多詳細信息:反而讓一個NSObject子類

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

但是,你可能只想做一個斯威夫特類(或在本例中,結構看一看this question and answers用於解釋的差異)

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

因爲此對象不在一個Objective-C的對象可以使用印刷,並獲得內部屬性印刷,以及:

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

p/s歡迎來到StackOverflow!

+0

非常感謝!我想我現在明白了 – Tom