【问题标题】:Generic parameter 'Element' could not be inferred when adding to Array添加到数组时无法推断通用参数“元素”
【发布时间】:2017-12-06 05:38:24
【问题描述】:

我有一个数组字典:

var myDict : [String:[SomeObj]] = [:]

为了填充它,我尝试在数组的正确索引处添加一个值。如果数组不存在,它将失败,我在该索引处创建一个新数组:

if myDict[key]?.append(val) == nil {
    myDict[key] = [val]
}

我认为我应该能够将其缩短为:

myDict[key]?.append(val) ?? myDict[key] = [val]

但是,我得到了错误:Generic parameter 'Element' could not be inferred。为什么?

【问题讨论】:

  • 您将nil-coalescing 用于错误目的。不要将它们用于无论如何,它只是工作的原因。
  • @nayem 你能详细说明一下吗?为什么这是错误的?

标签: ios arrays swift dictionary


【解决方案1】:

Swift 3.0

考虑简单的概念:-

单行中使用if...else 时,操作应该是单行的,否则我们需要将parenthesis 下的操作配对以使其成为单个操作,在我们的例子中append(val) 是单个操作,但 myDict[key] = [val] 是多个(myDict[key] 是一,= 赋值是一,[val] 是一)所以我们使用parenthesis 将它们分组为单个

以更简单的方式考虑以下arithmatic operations

//I need 10-5 = 5
let a = 2*4+2-4-3*5
print(a) // -9
//so we can seprate by ()
let b = ((2*4)+2)-(4-3)*5
print(b) //5

在这里,我们在let a 指示编译器不是预期的方式。

另见,

let a:Int? = nil
var b:Int? = nil
let d = 10

let c = a ?? 10 * b ?? d

这里let c是错误指令,错误是,

可选类型“Int?”的值未拆封;你的意思是用'!' 还是“?”?

如果我强制unwrappingoptionals a and b,那么错误就会变成,

在展开可选值时意外发现 nil

所以常数c变成了,

let c = a ?? 10 * (b ?? d) //100

这就是你应该在default 值周围使用parenthesis

myDict[key]?.append(val) ?? (myDict[key] = [val])

【讨论】:

  • 不错。知道错误试图解释什么吗?
  • @GoldenJoe,看解释:)
【解决方案2】:

最好这样做:

var array = myDict.removeValue(forKey: key) ?? []
array.append(item)
myDict[key] = array

它在突变之前从myDict 中删除array,因此array 将是对数组内存的唯一引用。因为它是唯一引用的,所以可以对其执行可变操作,而无需复制数组的内存。

没有这个,每个myDict[key]?.append(val) 调用都会导致写时复制操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多