Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json reduce函数正在打印空字典[:]_Json_Swift_Dictionary_Reduce_Codable - Fatal编程技术网

Json reduce函数正在打印空字典[:]

Json reduce函数正在打印空字典[:],json,swift,dictionary,reduce,codable,Json,Swift,Dictionary,Reduce,Codable,在这篇文章中,我成功地将字典键缩减为伪代码,而没有真正的json模型。我在上一个问题中实现的目标是只返回具有匹配值的键。因此,输出的是一个类似于以下内容的字典:“@jade”,“@kalel”]。这正是我所需要的。当然,可能还有其他匹配项,我也想返回这些匹配项 现在我有了一个正确的json模型,reduce函数正在打印一个空字典[:]。是不是.reduce中的类型导致了这个问题 所有数据都在打印,因此json和模型结构必须正确。 json 用户模型 public typealias Users

在这篇文章中,我成功地将字典键缩减为伪代码,而没有真正的json模型。我在上一个问题中实现的目标是只返回具有匹配值的键。因此,输出的是一个类似于以下内容的字典:“@jade”,“@kalel”]。这正是我所需要的。当然,可能还有其他匹配项,我也想返回这些匹配项

现在我有了一个正确的json模型,reduce函数正在打印一个空字典
[:]
。是不是
.reduce中的类型导致了这个问题

所有数据都在打印,因此json和模型结构必须正确。

json

用户模型

public typealias Users = [UserModel]
public struct UserModel: Codable {

public let name: String
public let game: String
// etc...

enum CodingKeys: String, CodingKey {
    case name
    case game
    // etc...
游乐场

guard let url = Bundle.main.url(forResource: "Users", withExtension: "json") else {
    fatalError()
}
guard let data = try? Data(contentsOf: url) else {
    fatalError()
}

let decoder = JSONDecoder()

do {
    let response = try decoder.decode([UserModel].self, from: data)
    for userModel in response {

        let userDict: [String:String] = [ userModel.name:userModel.game ]

        let reduction = Dictionary(grouping: userDict.keys) { userDict[$0] ?? "" }.reduce(into: [String:[String]](), { (result, element) in
            if element.value.count > 1 {
                result[element.key] = element.value
            }
        })
        // error catch etc
}

你的代码太复杂了。你只需使用

let response = try decoder.decode([UserModel].self, from: data)
let reduction = Dictionary(grouping: response, by: {$0.game}).mapValues{ usermodel in usermodel.map{ $0.name}}

你的代码太复杂了。你只需使用

let response = try decoder.decode([UserModel].self, from: data)
let reduction = Dictionary(grouping: response, by: {$0.game}).mapValues{ usermodel in usermodel.map{ $0.name}}

更新我可能误解了您想要的内容。下面还有另一个代码,请检查结果并选择一个您想要的

如果您想使用
reduce(into:updateacumatingresult:)
,您可以编写如下代码

do {
    let response = try decoder.decode([UserModel].self, from: data)
    let userArray: [(name: String, game: String)] = response.map {($0.name, $0.game)}

    let reduction = userArray.reduce(into: [String:[String]]()) {result, element in
        if !element.game.isEmpty {
            result[element.name, default: []].append(element.game)
        }
    }
    print(reduction)
} catch {
    print(error)
}
如果您喜欢使用
字典
的初始值设定项,这可能适用于:

do {
    let response = try decoder.decode([UserModel].self, from: data)
    let userArray: [(name: String, games: [String])] = response.map {
        ($0.name, $0.game.isEmpty ? [] : [$0.game])
    }

    let reduction = Dictionary(userArray) {old, new in old + new}
    print(reduction)
} catch {
    print(error)
}
两种输出:

["@jade": ["WoW"], "@kalel": ["WoW"]]
无论如何,除了
userDict.keys
之外,您将loop、
Dictionary(grouping:)
reduce(into:)
组合在一起的方式使事情变得过于复杂


添加当您想获得一本带有按键的字典作为游戏时:

do {
    let response = try decoder.decode([UserModel].self, from: data)
    let userArray: [(game: String, name: String)] = response.compactMap {
        $0.game.isEmpty ? nil : ($0.game, $0.name)
    }

    let reduction = userArray.reduce(into: [String:[String]]()) {result, element in
        result[element.game, default: []].append(element.name)
    }
    print(reduction)
} catch {
    print(error)
}
或:

输出:

["WoW": ["@jade", "@kalel"]]

更新我可能误解了您想要的内容。下面还有另一个代码,请检查结果并选择一个您想要的

如果您想使用
reduce(into:updateacumatingresult:)
,您可以编写如下代码

do {
    let response = try decoder.decode([UserModel].self, from: data)
    let userArray: [(name: String, game: String)] = response.map {($0.name, $0.game)}

    let reduction = userArray.reduce(into: [String:[String]]()) {result, element in
        if !element.game.isEmpty {
            result[element.name, default: []].append(element.game)
        }
    }
    print(reduction)
} catch {
    print(error)
}
如果您喜欢使用
字典
的初始值设定项,这可能适用于:

do {
    let response = try decoder.decode([UserModel].self, from: data)
    let userArray: [(name: String, games: [String])] = response.map {
        ($0.name, $0.game.isEmpty ? [] : [$0.game])
    }

    let reduction = Dictionary(userArray) {old, new in old + new}
    print(reduction)
} catch {
    print(error)
}
两种输出:

["@jade": ["WoW"], "@kalel": ["WoW"]]
无论如何,除了
userDict.keys
之外,您将loop、
Dictionary(grouping:)
reduce(into:)
组合在一起的方式使事情变得过于复杂


添加当您想获得一本带有按键的字典作为游戏时:

do {
    let response = try decoder.decode([UserModel].self, from: data)
    let userArray: [(game: String, name: String)] = response.compactMap {
        $0.game.isEmpty ? nil : ($0.game, $0.name)
    }

    let reduction = userArray.reduce(into: [String:[String]]()) {result, element in
        result[element.game, default: []].append(element.name)
    }
    print(reduction)
} catch {
    print(error)
}
或:

输出:

["WoW": ["@jade", "@kalel"]]

@tymac我可以编译一些东西而不必花时间处理json。谢谢你的输入。这就是我所有的代码。没有什么需要处理的。Vadian和OOper都在几分钟内回答了,没有额外的代码。模型和所有东西都清晰可见。换言之,我想要一些可以复制到空s中的东西wift file,单击compile,然后查看您的问题。现在您的代码执行许多与您的问题无关的操作。它从主bundel加载一个
Users.json
文件(这意味着潜在的应答者需要创建一个新的xcode项目,并创建这样的文件),它解码json(即使可以使用直接初始化的
UserModel
structs重新创建相同的问题,而无需解析JSON),等等。请特别参阅:“使用尽可能少的仍然产生相同问题的代码”,“创建一个新程序,只添加查看问题所需的内容”,“消除与问题无关的任何问题"等。@tymac一些我可以编译的东西,而不必花时间处理json。谢谢你的输入。这就是我所有的代码。没有什么需要处理的。Vadian和OOper都在几分钟内回答了,没有额外的代码。模型和所有东西都清晰可见。换言之,我想要一些我可以复制到e中的东西mpty Swift file,单击compile,然后查看您的问题。现在您的代码执行许多与您的问题无关的操作。它从主bundel加载一个
Users.json
文件(这意味着潜在的应答者需要创建一个新的xcode项目,并创建这样的文件),它解码json(即使可以使用直接初始化的
UserModel
structs重新创建相同的问题,而无需解析JSON),等等。请特别参阅:“使用尽可能少的仍然产生相同问题的代码”,“创建一个新程序,只添加查看问题所需的内容”,“消除与问题无关的任何问题",等等。请查看添加到问题底部的新代码。如果这是正确的,我仍然得到一个
类型的表达式不明确,没有更多上下文
错误。删除循环。我更新了答案以将值映射到它们的名称。使用给定的JSON,不得出现错误。请查看添加到问题底部的新代码n、 如果这是正确的,我仍然得到一个
类型的表达式是不明确的,没有更多的上下文
错误。删除循环。我更新了答案以将值映射到它们的名称。使用给定的JSON,错误一定不会发生。谢谢。我将更新您的答案。我将@vadian的答案标记为正确,因为他首先使用了正确的算法。而不是我将投票支持你的答案。我把@vadian的答案标为正确,因为他是第一个使用正确算法的人。