Я абсолютный новичок со Свифтом, но я чувствую, что это должно быть возможно, и что кто-то сделал это до меня.
Вот моя проблема:
У меня есть 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
}
}