Как импортировать вложенные словари из списка в Swift - PullRequest
0 голосов
/ 10 января 2019

Я абсолютный новичок со Свифтом, но я чувствую, что это должно быть возможно, и что кто-то сделал это до меня.

Вот моя проблема: У меня есть plist с кучей классов персонажей в игре. Каждый персонаж развивается уникально. В идеале я бы сделал массив Level_Progression с 10 под-словарями в словаре классов символов, который я импортирую из plist. Так как уровень персонажа повышается, приложение просматривает разбивку Level_Progression, чтобы обновить некоторые поля в зависимости от уровня персонажа.

Вот вопрос:

Как импортировать вложенный массив и под-словари, чтобы мое приложение понимало взаимосвязи данных?

Вот список с некоторыми данными заполнителя, отформатированный так, как мне кажется, для справки:

<?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>ClassName</key>
        <string>Barb</string>
        <key>Level_Progression</key>
        <array>
            <dict>
                <key>Level</key>
                <integer>1</integer>
                <key>HP_Mult</key>
                <integer>3</integer>
            </dict>
            <dict>
                <key>Level</key>
                <integer>2</integer>
                <key>HP_Mult</key>
                <integer>3</integer>
            </dict>
            <dict>
                <key>Level</key>
                <integer>3</integer>
                <key>HP_Mult</key>
                <integer>5</integer>
            </dict>
            <dict>
                <key>Level</key>
                <integer>4</integer>
                <key>HP_Mult</key>
                <integer>5</integer>
            </dict>
            <dict>
                <key>Level</key>
                <integer>5</integer>
                <key>HP_Mult</key>
                <integer>9</integer>
            </dict>
        </array>
    </dict>
    <dict>
        <key>ClassName</key>
        <string>Cleric</string>
        <key>Level_Progression</key>
        <array>
            <dict>
                <key>Level</key>
                <integer>1</integer>
                <key>HP_Mult</key>
                <integer>3</integer>
            </dict>
            <dict>
                <key>Level</key>
                <integer>2</integer>
                <key>HP_Mult</key>
                <integer>3</integer>
            </dict>
            <dict>
                <key>Level</key>
                <integer>3</integer>
                <key>HP_Mult</key>
                <integer>5</integer>
            </dict>
            <dict>
                <key>Level</key>
                <integer>4</integer>
                <key>HP_Mult</key>
                <integer>5</integer>
            </dict>
            <dict>
                <key>Level</key>
                <integer>5</integer>
                <key>HP_Mult</key>
                <integer>9</integer>
            </dict>
        </array>
    </dict>
</array>
</plist>

А вот как выглядит мой скрипт импорта, который, как я знаю, не работает. У меня есть это в отдельном файле swift, тогда я планирую просто вызвать struct из ViewController, как только я импортирую все данные

import Foundation
struct CharClass {
    let className: String
    let level_Progress: Array<Dictionary<String, Int>>
    let level: Dictionary<String, Int>.Element
    let hp_Mult: Dictionary<String, Int>.Element




    static func classesList(_ fileName: String) -> [CharClass] {
        var charClasses = [CharClass]()

        if let classList = NSArray(contentsOfFile: fileName) as? [[String: Any]] {
            for dict in classList {
                if let charClass = CharClass(dictionary: dict) {
                    charClasses.append(charClass)
                }
            }
        }
        return charClasses
    }




    init?(dictionary: [String: Any]) {
        guard let className = dictionary["ClassName"] as? String,
            let level_Progress = dictionary["Level_Progress"] as? Array<Dictionary<String, Int>>,
            let level = dictionary["Level"] as? Dictionary<String, Int>.Element,
            let hp_Mult = dictionary["HP_Mult"] as? Dictionary<String, Int>.Element else {
                return nil
        }

        self.className = className
        self.level_Progress = level_Progress
        self.level = level
        self.hp_Mult = hp_Mult
    }
}
...