无法将类型“ Int”的值分配给类型“ Int?”

时间:2019-03-30 06:58:51

标签: swift

我正在尝试在count数组中找出姓氏和姓氏值的a并以相同的键将结果返回为[String: Int]

此行newResult[arg.key] = counts上出现错误。 无法将类型为“ Int”的值分配给类型为“ Int?”

  func abbreviation(a:[String], b: [String : String]) ->[String : Int] {
        let dict = b.reduce([String : Int]()){ (result, arg) in
            var newResult = result
            let counts = a.reduce(0) { (newcount, value) -> Int in
                let count = newcount + (value.components(separatedBy:arg.value).count - 1)
                return count
            }
            return newResult[arg.key] = counts
        }
        return dict
    }

//结果

let dict = abbreviation(a:["This is chandan kumar and chandan kumar and new chandan","check chandan kumar","non ame"], b:["first":"chandan","last":"kumar"])

2 个答案:

答案 0 :(得分:1)

错误消息是如此混乱,您可能需要习惯将其视为Swift cannot infer some types in this context

此行:

return newResult[arg.key] = counts

您知道此return语句返回的内容吗?这是Void,也称为空元组。 (Void是Swift中赋值语句的结果类型。)您可能曾期望newResult是闭包的结果,但是除非您明确编写{{1} }。

尝试将行更改为以下内容:

return newResult

答案 1 :(得分:1)

您正在尝试返回赋值表达式的结果:

return newResult[arg.key] = counts

还是您正在尝试分配给return语句的结果?这条线没有意义,您以哪种方式看待它。您应该将正在做的两件事分开:

newResult[arg.key] = counts
return newResult

似乎在这种情况下,您应该使用reduce方法的另一重载-reduce(into:_:)

当前使用的reduce方法要求您每次都返回一个新值,但是您只是将KVP添加到字典中,即修改现有值。这意味着您正在创建许多词典的副本。这是一个很好的信号,表明reduce(into:_:)可能更合适。

func abbreviation(a:[String], b: [String : String]) ->[String : Int] {
    // notice the parameter label "into:"
    let dict = b.reduce(into: [String : Int]()){ (result, arg) in
        let counts = a.reduce(0) { (newcount, value) -> Int in
            let count = newcount + (value.components(separatedBy:arg.value).count - 1)
            return count
        }
        result[arg.key] = counts // with reduce(into:_:), you don't return anything, just modify the first argument
    }
    return dict
}