Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Swift3中json解析数组的奇怪结果_Arrays_Json_Swift3 - Fatal编程技术网

Arrays Swift3中json解析数组的奇怪结果

Arrays Swift3中json解析数组的奇怪结果,arrays,json,swift3,Arrays,Json,Swift3,嗨,伙计们,我不知道为什么数组Places返回像0x6080004b3aa0这样的奇怪值,而不是显示我的JSON url中的标题、坐标和副标题。谢谢你的帮助 import MapKit @objc class Place: NSObject { var title: String? var coordinate: CLLocationCoordinate2D var subtitle: String? init(title:String,subtitle

嗨,伙计们,我不知道为什么数组Places返回像0x6080004b3aa0这样的奇怪值,而不是显示我的JSON url中的标题、坐标和副标题。谢谢你的帮助

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(纬度,经度))


当I
print(place)
它返回奇怪的结果

当您创建一个从
NSObject
子类的类时,您正在创建一个由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>
但是,您可能不想创建NSObject子类,而只想创建一个Swift类(或者在本例中是一个struct,以了解差异的解释)

由于此对象不是Objective-c对象,因此可以使用print并打印内部属性:

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

p/s欢迎使用StackOverflow!

我是否应该再次将此问题标记为重复问题?您是否阅读了上一个问题中的链接问题?它与Swift版本无关。在任何版本的Swift中,您都无法从包含异步任务的方法返回内容。奇怪打印结果的原因是您的
位置
class缺少
description
属性,所以只能得到指针地址。很抱歉@vadian,但我用plist尝试了完全相同的方法,效果非常好,所以为什么不能与外部json一起工作呢?再一次,
dataTask
异步工作非常感谢!我想我现在已经找到了
struct Place {
    let name: String
    init(name: String) {
        self.name = name
    } 
}
let testPlace = Place(name: "New York")
print(testPlace)
// Prints: 
// Place(name: "New York")