【发布时间】:2017-08-07 01:05:15
【问题描述】:
使用时:
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吗?
编辑到 City 类:
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
【问题讨论】:
-
不要用答案编辑您的问题。它否定了你问题的全部意义。
标签: arrays swift types properties