Double в объекте преобразуется в строку при добавлении в другой объект - PullRequest
0 голосов
/ 25 апреля 2018

Double в объекте преобразуется в строку (или просто идет в кавычки) при добавлении в другой объект.Я не хочу такого поведения.Я хочу, чтобы double оставался как double, чтобы правила моей базы данных работали идеально

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; }]

Пожалуйста, предложите, что я могу сделать, чтобы достичь желаемого результата

Примечание: Вы можете запустить этот код на детской площадке для проверки.

Отредактировано

Вопросвсе еще не решена.После ответов на вопросы я сделал модель и разместил ее на своей базе.Теперь это исключение, которое я получаю взамен

'InvalidFirebaseData', причина: '(setValue: withCompletionBlock :) Невозможно сохранить объект типа _SwiftValue в cardCost.Может хранить только объекты типа NSNumber, NSString, NSDictionary и NSArray. '

Я хочу сделать его доступным для чтения в Firebase

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

obj["pi"] - a Double. Вы можете проверить это следующим образом ...

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
0 голосов
/ 25 апреля 2018

Хотя я согласен с ответом Эшли Миллс :

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].

...