从 Swift 中的字典中读取 - 不工作

Reading from a dictionary in Swift - Not working

我正在 Xcode 中构建游戏,我正在将关卡的详细信息存储在文本文件中,例如Level1.txt、Level2.txt等

我从文本文件中读取数据并将其存储在字典中。 当我尝试将字典中的值分配给全局变量时,它不起作用。

文本文件内容 (Level1.txt)

 LevelNum:1 
 weaponPickupRate:10.0
 weaponPickupAmount:50.0
 monsterMinSpeed:10.0
 monsterMaxSpeed:15.0
 monsterRate:1.0
 totalMonsters:10.0
 goldPerMonster:10

全局变量

var settings = [String: Any]()
var monsterMaxSpeed = 0.0

获取关卡详情的函数

func GenerateLevel(levelNumber: Int) {

    fileName = "level\(levelNumber).txt"
    levelPath = "\(NSBundle.mainBundle().resourcePath!)/\(fileName)"

    var err: NSError? = NSError()
    let s = String(contentsOfFile: levelPath, encoding: NSUTF8StringEncoding, error: &err)

    if let content = s {
        var array = content.componentsSeparatedByString("\n")

        for a in array {
            var v = a.componentsSeparatedByString(":")
            settings[v[0]] = v[1]
        }

    }

    println(settings) // A

    var e = settings["monsterMaxSpeed"]
    println(e) // B

    monsterMaxSpeed = settings["monsterMaxSpeed"] // C

 }

Println(设置) (A) - 打印:

[monsterRate: 1.0, monsterMinSpeed: 10.0, weaponPickupRate: 10.0, weaponPickupAmount: 50.0, goldPerMonster: 10, totalMonsters: 10.0, LevelNum: 1, monsterMaxSpeed: 15.0]

Println(e) (B) 打印:

可选(“15.0”)

这条线不工作

它显示错误并且不允许我构建我的项目。给出的错误是:

'(String, Any)' 不可转换为 'Double'

monsterMaxSpeed = settings["monsterMaxSpeed"]

有人可以帮助我并告诉我我需要做什么吗?

谢谢,

瑞安

你这里有两个问题。

首先,通过键值从 [String:Any] 字典中获取数据不会 return 和 Any。它 return 是一个 Any?,即可能包含也可能不包含 Any 的可选项。这是因为该键可能不存在于字典中。

您需要测试该值是否为非 nil,如果为:

if let speed = settings["monsterMaxSpeed"] {
    monsterMaxSpeed = speed
}
else {
    // handle there being no speed setting in your file
    // by reporting an error or similar
}

或者,如果您对使用默认值感到满意,则可以使用 nil 合并运算符:

// if the key is present, us the unwrapped value, if not use 0.0
monsterMaxSpeed = settings["monsterMaxSpeed"] ?? 0.0

其次,您已将 monsterMaxSpeed 声明为 Double 而不是 Any。所以一旦你解决了可选的展开问题,你就会遇到第二个问题。您需要使用 as?Any 转换为 Doubleas? 中的 ? 很重要——如果该值不是双精度值(假设您的文件中的条目中有一个流氓字符),您将得到一个 nil 返回。同样,您需要对此进行测试并处理错误。

幸运的是,您可以一次完成所有这些:

monsterMaxSpeed = (settings["monsterMaxSpeed"] as? Double) ?? 0.0

(可能是这两个问题的共同作用导致您遇到一个特别神秘的错误——该错误与 Dictionary.subscriptother 版本有关采用索引,而不是键,并且 return 是一个 key/value 对,这不是可选的,因为索引应该只处理肯定在字典中的条目)