添加到Array时无法推断通用参数“元素”
我有一个数组字典:
var myDict : [String:[SomeObj]] = [:]
为了填充它,我尝试在正确的索引处向数组添加一个值。 如果数组不存在,则失败,并在该索引处创build一个新数组:
if myDict[key]?.append(val) == nil { myDict[key] = [val] }
我想我应该能够缩短这个:
myDict[key]?.append(val) ?? myDict[key] = [val]
但是,而是我得到的错误: Generic parameter 'Element' could not be inferred
。 为什么?
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:Int? = nil var b:Int? = nil let d = 10 let c = a ?? 10 * b ?? d
这里let c
是错误的指令,错误是,
可选types'Int?'的值 不解开; 你的意思是使用'!' 要么 '?'?
如果我强制unwrapping
optionals a and b
,那么错误将会变成,
意外地发现零,而解包一个可选的值
所以常数c
变成了,
let c = a ?? 10 * (b ?? d) //100
这就是你应该使用parenthesis
的default
值。
myDict[key]?.append(val) ?? (myDict[key] = [val])
最好这样做:
var array = myDict.removeValue(forKey: key) ?? [] array.append(item) myDict[key] = array
它在突变之前从myDict
移除array
,以便array
将成为对数组内存的唯一引用。 由于它是唯一引用的,因此可以对其执行可变操作,而无需复制arrays的内存。
如果没有这个,每个myDict[key]?.append(val)
调用都会导致写入时复制操作。