0

当添加到另一个对象中时,对象中的双精度会转换为字符串(或只是进入引号)。我不想要这种行为。我希望双倍保持双倍,以便我的数据库规则完美运行

var list: [String: AnyObject] = [:]

var obj: [String: Any] = [:]
obj["pi"] = 3.14
obj["test"] = "hello"

list["firstObj"] = obj as AnyObject

print(list)

这是结果:

["firstObj": { pi = "3.14"; test = hello; }]

我要这个

["firstObj": { pi = 3.14; test = hello; }]

请建议我该怎么做才能达到预期的结果

注意:您可以在 Playground 中运行此代码进行检查。

已编辑

这个问题仍然没有解决。遵循答案后,我制作了模型并将其发布到我的火力基地。现在这是我得到的例外

'InvalidFirebaseData',原因:'(setValue:withCompletionBlock:) 无法在 cardCost 存储 _SwiftValue 类型的对象。只能存储 NSNumber、NSString、NSDictionary 和 NSArray 类型的对象。

我想让它在火力基础上可读

4

2 回答 2

2

obj["pi"] 一个Double。您可以按如下方式进行测试……</p>

var list: [String: Any] = [:]
var obj: [String: Any] = [:]
obj["pi"] = 3.14
obj["test"] = "hello"    
list["firstObj"] = obj as Any

func printTypesFor(dict: [String: Any]) {
    for (key, value) in dict {
        print(key + " is a " + "\(type(of: value))")
        if let valueDict = value as? [String: Any] {
            printTypesFor(dict: valueDict)
        }
    }
}

printTypesFor(dict: list)


firstObj is a Dictionary<String, Any>
test is a String
pi is a Double
于 2018-04-25T10:02:04.630 回答
0

虽然我同意阿什利米尔斯的回答

obj["pi"]是双

我建议“模板化”它而不是使用字典,它可以避免手动类型转换并确保类型安全。您可以创建一个自定义模型并让其obj成为该模型的类型。例子:

struct MyModel {
    var pi: Double
    var test: String
}

然后声明obj为:

var obj = MyModel(pi: 3.14, test: "hello")

因此,list可以声明为:

var list = [MyModel]()

而不是被声明为[String: AnyObject].

于 2018-04-25T09:58:40.460 回答