我正在尝试在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"])
答案 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
}