【问题标题】:How to populate an array with a data from a function?如何用函数中的数据填充数组?
【发布时间】:2016-12-27 09:25:55
【问题描述】:

你好我有以下功能:

 func parceDosi()
{

    struct City{

        let name : String
      //  let location : CLLocation

    }

    var cities = [City]()


    var person = "Person"
    let path: String = NSBundle.mainBundle().pathForResource("jsonFile", ofType: "json") as String!
    let jsonData = NSData(contentsOfFile: path) as NSData!
    let ReadableJSON = JSON ( data:jsonData, options: NSJSONReadingOptions.MutableContainers, error: nil )

    NumberRows = ReadableJSON ["People"].count

    for (var i = 0 ; i <= NumberRows; i++ )
    {
        Person += "\(i)"

        let NameImeNaObekt = ReadableJSON ["People"] [Person] ["B1"].string as String!

        let NameShirina = ReadableJSON ["People"] [Person] ["C1"].string as String!

        let NameDuljina = ReadableJSON ["People"] [Person] ["D1"].string as String!

        let latitude    =   (NameShirina as NSString).doubleValue
        let longitude   =   (NameDuljina as NSString).doubleValue
   //     let loc         =  CLLocation( latitude: latitude, longitude: longitude)
    //    let ci          =  City(name: NameImeNaObekt, location: loc)

        let ci    =  City( name: NameImeNaObekt)

        cities.append(ci)

从 json 文件中读取信息。读取的信息我想将其返回到

var 数据 = [??]

如果采用以下方式,此变量数据可以正常工作:

var data = [纽约,波士顿,加利福尼亚],

但我不想写 New York, Boston, California ,而是想返回函数 函数 parceDosi(), 因为所有的城市都是从一个 json 文件中解析出来的,我不必写每一个。你知道怎么做吗,我是新手,我的语法有问题。 这是 JSON 文件:

  {
      "People": {
        "Person0": {
            "A1": "Безплатен Сок",
            "B1": "Царево 11",
            "C1": "43.0757",
            "D1": "23.6172",
            "E1": "http://weknowyourdreams.com/image.php?pic=/images/beer/beer-07.jpg"
                   },

        "Person1": {
            "A1": "Безплатна Бира",
            "B1": "Царево 22",
            "C1": "44.0757",
            "D1": "24.6172",
            "E1": "http://weknowyourdreams.com/image.php?pic=/images/beer/beer-07.jpg"
                    },
"Person2": {
    "A1": "Безплатен Десерт",
    "B1": "Царево 33",
    "C1": "45.0757",
    "D1": "25.6172",
    "E1": "http://weknowyourdreams.com/image.php?pic=/images/beer/beer-07.jpg"
},
"Person3": {
    "A1": "Безплатно Кафе",
    "B1": "Царево 55",
    "C1": "41.0757",
    "D1": "21.6172",
    "E1": "http://weknowyourdreams.com/image.php?pic=/images/beer/beer-07.jpg"
},
"Person4": {
    "A1": "Безплатна Кола",
    "B1": "Царево 66",
    "C1": "46.0757",
    "D1": "26.6172",
    "E1": "http://weknowyourdreams.com/image.php?pic=/images/beer/beer-07.jpg"


    }
  }
  }

【问题讨论】:

  • 您没有正确声明结构,它将在函数之外不在内部,并且从您之前的问题城市名称中包含键 A1 而不是 B1。您的代码中也没有数据变量。
  • 你能告诉我什么是正确的声明吗?
  • 代码很难阅读。变量名应该以小写字母开头,以免与名称应该以大写字母开头的类和结构混淆。
  • 对此我感到很抱歉,我一个月前开始使用 swift,但我还是个初学者,但与其批评我,我更愿意学习新的东西,通过更正我的代码对的。
  • 我批评你是为了你自己的利益。你写的代码越清晰,你得到的答案就越多、越快。此外,你已经学到了一些新的东西;-)

标签: arrays json swift


【解决方案1】:

JSON 中的每个 Person 包含 5 个键值对,所以我扩展了结构体 City,属性 location 将根据纬度和经度创建:

struct City {
  let name : String
  let city : String
  let location : CLLocation
  let imageURL : NSURL
}

由于您使用的是 SwiftJSON,因此解析非常清晰

var cities = [City]()

func parceDosi() {
  guard let url = NSBundle.mainBundle().URLForResource("jsonFile", withExtension: "json"), jsonData = NSData(contentsOfURL: url) else {
    print("Error finding JSON File")
    return
  }

  let readableJSON = JSON(data: jsonData) // the mutable option is not needed.

  let people = readableJSON["People"].dictionaryValue
  for (_, person) in people {
    let personName = person["A1"].stringValue
    let cityName = person["B1"].stringValue
    let latitude = person["C1"].doubleValue
    let longitude = person["D1"].doubleValue
    let imageURL = person["E1"].stringValue

    let city = City(name: personName, city: cityName, location: CLLocation(latitude: latitude, longitude: longitude), imageURL: NSURL(string:imageURL)!)
    cities.append(city)
  }

  // This is an example to get the nearest city from a given location

  let myLocation = CLLocation(latitude: 50.0, longitude: 8.0)
  let nearestlocations = cities.sort { (city1, city2) -> Bool in
    return city1.location.distanceFromLocation(myLocation) < city2.location.distanceFromLocation(myLocation)
  }
  print(nearestlocations.first!)
}

PS:由于您负责包中的 JSON 文件,我建议为人员使用数组(而不是字典),并为“棋盘”键提供更具描述性的名称。

【讨论】:

  • 非常感谢您的专业代码!我真的很感激它,并且会学习它。根据您的代码,我可以看到您返回了所有 5 键值。在我的应用程序中,我还需要将用户的当前位置与 JSON 文件中的其他位置进行比较。你能告诉我如何比较吗?
  • 我更新了答案,添加了一些代码以从给定位置获取最近的城市。
  • 您能告诉我如何在表格视图单元格上显示您的值吗?我创建了一个新的表格视图控制器和表格视图单元格,我应该将其发送给您还是您可以理解我?
猜你喜欢
  • 2018-12-23
  • 2020-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-25
  • 2013-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多