从 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
转换为 Double
。 as?
中的 ?
很重要——如果该值不是双精度值(假设您的文件中的条目中有一个流氓字符),您将得到一个 nil
返回。同样,您需要对此进行测试并处理错误。
幸运的是,您可以一次完成所有这些:
monsterMaxSpeed = (settings["monsterMaxSpeed"] as? Double) ?? 0.0
(可能是这两个问题的共同作用导致您遇到一个特别神秘的错误——该错误与 Dictionary.subscript
的 other 版本有关采用索引,而不是键,并且 return 是一个 key/value 对,这不是可选的,因为索引应该只处理肯定在字典中的条目)
我正在 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
转换为 Double
。 as?
中的 ?
很重要——如果该值不是双精度值(假设您的文件中的条目中有一个流氓字符),您将得到一个 nil
返回。同样,您需要对此进行测试并处理错误。
幸运的是,您可以一次完成所有这些:
monsterMaxSpeed = (settings["monsterMaxSpeed"] as? Double) ?? 0.0
(可能是这两个问题的共同作用导致您遇到一个特别神秘的错误——该错误与 Dictionary.subscript
的 other 版本有关采用索引,而不是键,并且 return 是一个 key/value 对,这不是可选的,因为索引应该只处理肯定在字典中的条目)