2016-12-27 8 views
1

Возможно, простой вопрос, как указать несколько путей пакета для быстрого чтения без необходимости копировать этот код несколько раз?Как указать несколько пучков связок в 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)") 
       } 
      } 
     } 
    } 

Я хочу быстр доступ к тем же элементам Dict из нескольких файлов Plist, но до сих пор мое единственное решение повторить этот код для 17+ файлов. Любой провел бы признательна

+0

Подождите, почему вид Int? O.o ' – Alexander

+0

возвращает номер вида. Порядок должен отображаться. И жаль, что я не слишком разбираюсь в кодировании Swift, я не знаю, что вы подразумеваете под конкретизацией CustomStringRepresentable. – user4938361

+0

Этот вид может быть лучше смоделирован с помощью enum. Как со всеми вещами, о которых вы не знаете, я упомянул об этом, просто посмотрите, и возвращайтесь сюда, чтобы задать любые вопросы, которые могут возникнуть. – Alexander

ответ

1

попробовать что-то вроде этого:

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 
} 
+0

Спасибо Alexander. Im получает ошибку «Невозможно вывести сложные типы возврата закрытия» в этой строке -----> let pokes = resourceNames.flatMap {resourceName в guard let plistPath = Bundle.main.path (forResource: resourceName, ofType: "plist") – user4938361

+0

@ user4938361 Исправлено: – Alexander

+0

Я уже исправил эту строку до комментирования. Ошибка кажется несвязанной. Кроме того, я не могу использовать расширение, если не добавить «удобство» перед инициализатором, потому что -> «назначенный init не может быть объявлен в расширении ». Я использую Swift 3, если это помогает – user4938361