gpt4 book ai didi

arrays - 将 plist 读入特定类型

转载 作者:搜寻专家 更新时间:2023-10-31 22:43:16 25 4
gpt4 key购买 nike

使用时:

let cities: [[String : String]] = {
guard let URL = Bundle.main.url(forResource: "cities", withExtension: "plist") else {
return []
}
return NSArray(contentsOf: URL) as! [[String : String]]
}()

来自这里:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
<dict>
<key>name</key>
<string>Allentown, PA</string>
<key>icao</key>
<string>ABE</string>
</dict>
....
</array>
</plist>

以后使用以下方法很容易访问这些值:

    // inside tableView(_ cellForRowAt:)
city = cities[indexPath.row]
cell.icaoLabel?.text = city["icao"]
cell.nameLabel?.text = city["name"]

但是,在声明时:

class City {
var icao: String
var name: String

// is this init() necessary?
init(icao: String, name: String) {
self.icao = icao
self.name = name
}
}

和:

let cities: [City] = {
guard let URL = Bundle.main.url(forResource: "cities", withExtension: "plist") else {
return []
}
// ** No longer works
return NSArray(contentsOf: URL) as! [City]
// ** Doesn't work either
return NSArray(contentsOf: URL)
}()

最终,我想使用:

    // inside tableView(_cellForRowAt:)
city = cities[indexPath.row]
cell icaoLabel?.text = city.icao
cell nameLabel?.text = city.name

这是如何实现的?这样可以导入plist吗?

编辑城市类:

class City {
var icao: String?
var name: String?

init(icao: String, name: String) {
self.icao = icao
self.name = name
}

static func loadCities() -> [City] {
guard let URL = Bundle.main.url(forResource: "cities", withExtension: "plist") else {
return []
}
let tempCities = NSArray(contentsOf: URL) as! [[String : String]]

// now, create the desired cities array
var cities = [City]()
for city in tempCities {
guard let icaoTemp = city["icao"], let nameTemp = city["name"] else {
break
}
cities.append(City(icao: icaoTemp, name: nameTemp))
}

return cities
}
}

访问值:

    let city: City = cities[indexPath.row]
cell.icaoLabel?.text = city.icao
cell.airportNameLabel?.text = city.name

最佳答案

不,没有内置方法可以将 plist 数据直接转换为 City 对象数组。你需要自己做。

像现在一样加载 plist。然后迭代该数组获取每个小字典。要么提取这两个值并使用当前的 init 创建一个 City 实例,要么添加一个接受字典的新 init 并让 City 类自行设置。

最后,您使用在迭代原始 plist 数组时创建的每个 City 实例构建一个新数组。

将所有这些功能包装到一个 Cities 类中可能是有意义的,该类知道如何读取和写入 plist 文件并使用 City 实例列表.您最终可能会向类中添加其他适当的逻辑以处理城市列表。

关于arrays - 将 plist 读入特定类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42824217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com