2017-04-08 39 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