【问题标题】:Reading from a dictionary in Swift - Not working从 Swift 中的字典中读取 - 不工作
【发布时间】:2015-02-01 18:13:25
【问题描述】:

我正在 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(setting) (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"]

请有人帮助并建议我需要做什么?

谢谢,

瑞恩

【问题讨论】:

    标签: ios xcode swift dictionary double


    【解决方案1】:

    这里有两个问题。

    首先,按键从[String:Any] 字典中获取不会返回Any。它返回一个Any?,即一个可选的,可能包含也可能不包含Any。这是因为字典中可能不存在该键。

    您需要测试该值是否为非零,如果是则解开该值:

    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 版本有关,它采用索引,而不是键, 并返回一个键/值对,这不是可选的,因为索引应该只处理肯定在字典中的条目)

    【讨论】:

    • 这帮助很大。太感谢了。最后一个问题,如果它不是双精度并且是字符串..我需要改变什么? Double 到 String 和 0.0 到什么?再次干杯,瑞恩
    • 所以任何默认值都适合您的用例,而是一个字符串而不是数字。也许是一个空字符串(“”),也许是“错误”。或者您不必默认它,您可以使用 if/else 引发错误。
    • 我一直在继续构建游戏,但是当我使用如上所示的 'monsterMaxSpeed = settings["monsterMaxSpeed"] ?? 0.0' 或者每当我将它用于字典中的任何其他内容时,我返回的所有内容都为 0.0。这是为什么呢?
    猜你喜欢
    • 2023-02-04
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 2022-12-17
    • 2014-02-21
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多