'(key: String, value: Any)' не может быть преобразовано в '[String: Any]' - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь изменить код:

var indices = [String:[Int:Double]]()
apps.forEach { app in indices[app] = [Int:Double]()}

var index = 0
timeSeries.forEach { entry in
    entry.apps.forEach{ (arg: (key: String, value: Double)) in
        let (app, value) = arg
        indices[app]?[index] = value
    }

    index += 1
}

поэтому у меня есть подпись:

var parameters = timeSeries.map{ entry in entry.apps as [String:Any] }
var indices = getIndices(with: apps, in: parameters) as? [String:[Int:Double]] ?? [String:[Int:Double]]()

и метод:

func getIndices(with source: [String], in entryParameters: [[String:Any]]) -> [String:[Int:Any]] {
    var indices = [String:[Int:Any]]()
    source.forEach { item in indices[item] = [Int:Any]() }

    var index = 0
    entryParameters.forEach { (arg: (key: String, value: Any)) in
        let (key, value) = arg
        indices[key]?[index] = value

        index += 1
    }

    return indices
}

Но это (только в методе, а не в оригинале, который работает нормально) дает: '(key: String, value: Any)' is not convertible to '[String : Any]' в entryParameters в строке

Причина, по которой я должен использовать Any, заключается в том, что другой источник [String: [Int: Bool]]

изменить: некоторые подробности:

timeSeries - [TimeSeriesEntry]

// this will need to be defined per-model, so in a different file in final project
struct TimeSeriesEntry: Codable, Equatable {
    let id: String
    let uid: String
    let date: Date
    let apps: [String:Double]
    let locations: [String:Bool]

    func changeApp(app: String, value: Double) -> TimeSeriesEntry {
        var apps = self.apps
        apps[app] = value

        return TimeSeriesEntry(id: self.id, uid: self.uid, date: self.date, apps: apps, locations: self.locations)
    }
}

Примечания:

изменена подпись, спасибо, впечатление проблема остается.

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Я только что кратко проверил это на игровой площадке.

var double = [String:[Int:Double]]()
double["Taco"] = [2: 3.2]

func myFunc(double: [String:[Int:Double]]) {
    print(double.count) //Prints 1
    print(double["Taco"]!) //Prints [2:3.2]
}

func myFunc2(all: [String:Any]) {
    print(all.count) //Prints 1
    print(all["Taco"]!) //Prints [2:3.2]
}


myFunc(double: double)
myFunc2(all: double as [String:Any])

У меня есть начальный [String:[Int:Double]](). Внутри этого словаря я установил double["Taco"] = [2: 3.2]. Я могу использовать 2 разные функции, одну из которых принимают за исходный тип [String:[Int:Double]], и ее легко использовать, поскольку функции принимают один и тот же тип параметра. Тем не менее, теперь я создал функцию, которая принимает словарь [String:Any]. Теперь, чтобы ИСПОЛЬЗОВАТЬ этот метод, мы ДОЛЖНЫ типизировать переменные при вызове метода как [String:Any], как вы можете видеть ниже.

0 голосов
/ 17 января 2019

Проблема в том, что каждое значение в entryParameters является словарем, поэтому когда вы делаете entryParameters.forEach, вы получаете тип словаря в закрытии, а не (key, value).

Вы получите (key,value) при вызове forEach в этом словаре. Итак, ваш метод должен выглядеть примерно так:

func getIndices(with source: [String], in entryParameters: [[String:Any]]) -> [String:[Int:Any]] {
    var indices = [String:[Int:Any]]()
    source.forEach { item in indices[item] = [Int:Any]() }

    var index = 0
    entryParameters.forEach { entry in
        entry.forEach {(arg: (key: String, value: Any)) in
            let (key, value) = arg
            indices[key]?[index] = value
        }

        index += 1
    }

    return indices
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...