如何在不重复代码的情况下在 Swift 中指定多个包路径?
How to specify multiple bundle paths in Swift without repeating code?
可能是一个简单的问题,我如何指定多个包路径供 swift 读取而无需多次复制粘贴此代码?
if let path = Bundle.main.path(forResource: "extra-1", ofType: "plist") {
if let dictArray = NSArray(contentsOfFile: path) {
for item in dictArray {
if let dict = item as? NSDictionary {
let name = dict["identifier"] as! String
let species = dict["species"] as! Int
let animal = Animal(name: name, speciesId: species)
pokes.append(animal)
print("Name: \(name) Id: \(species)")
}
}
}
}
我希望 swift 从多个 plist 文件访问相同的字典项,但到目前为止我唯一的解决方案是对 17+ 个文件重复此代码。任何持有将不胜感激
尝试这样的事情:
extension Animal {
init(fromDict dict: [String: Any]) {
self.init(
name: dict["identifier"] as! String,
species: dict["species"] as! Int
)
}
}
let resourceNames = [
"extra-1", "extra-2", /* ... */ "extra-n"
]
let pokes = resourceNames.flatMap { resourceName -> [Animal] in
guard let plistPath = Bundle.main.path(forResource: resourceName, ofType: "plist") else {
fatalError("Nil path") //TODO: add error handling!
}
guard let array = NSArray(contentsOfFile: plistPath) else { fatalError("File read error") }
let arrayOfDicts = array.map{ element -> [String: Any] in
guard let dict = element as? [String: Any] else { fatalError("Element is not a dictionary!") }
return dict
}
let newPokes = arrayOfDicts.map(Animal.init(fromDict:))
print(newPokes)
return newPokes
}
可能是一个简单的问题,我如何指定多个包路径供 swift 读取而无需多次复制粘贴此代码?
if let path = Bundle.main.path(forResource: "extra-1", ofType: "plist") {
if let dictArray = NSArray(contentsOfFile: path) {
for item in dictArray {
if let dict = item as? NSDictionary {
let name = dict["identifier"] as! String
let species = dict["species"] as! Int
let animal = Animal(name: name, speciesId: species)
pokes.append(animal)
print("Name: \(name) Id: \(species)")
}
}
}
}
我希望 swift 从多个 plist 文件访问相同的字典项,但到目前为止我唯一的解决方案是对 17+ 个文件重复此代码。任何持有将不胜感激
尝试这样的事情:
extension Animal {
init(fromDict dict: [String: Any]) {
self.init(
name: dict["identifier"] as! String,
species: dict["species"] as! Int
)
}
}
let resourceNames = [
"extra-1", "extra-2", /* ... */ "extra-n"
]
let pokes = resourceNames.flatMap { resourceName -> [Animal] in
guard let plistPath = Bundle.main.path(forResource: resourceName, ofType: "plist") else {
fatalError("Nil path") //TODO: add error handling!
}
guard let array = NSArray(contentsOfFile: plistPath) else { fatalError("File read error") }
let arrayOfDicts = array.map{ element -> [String: Any] in
guard let dict = element as? [String: Any] else { fatalError("Element is not a dictionary!") }
return dict
}
let newPokes = arrayOfDicts.map(Animal.init(fromDict:))
print(newPokes)
return newPokes
}