I have a dictionary of arrays:
var myDict : [String:[SomeObj]] = [:]
To populate it, I try to add a value to the array at the correct index. If the array does not exist, it fails and I make a new array at that index:
if myDict[key]?.append(val) == nil {
myDict[key] = [val]
}
I think I should be able to shorten this to:
myDict[key]?.append(val) ?? myDict[key] = [val]
However, instead I get the error: Generic parameter 'Element' could not be inferred
. Why?
Swift 3.0
Consider the simple concept :-
While using if...else
in single line the operations should be single or else we need to mate operations under parenthesis
to make it as a single operation, in our case append(val)
is a single operation but myDict[key] = [val]
is multiple (myDict[key]
is one and =
assignment is one and [val]
is one ) so we are grouping them into single using parenthesis
.
At more simple way consider the following 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
Here, we are instructing the compiler not a expected way at let a
.
Also see,
let a:Int? = nil
var b:Int? = nil
let d = 10
let c = a ?? 10 * b ?? d
Here let c
is wrong instruction, error is,
Value of optional type 'Int?' not unwrapped; did you mean to use '!' or '?'?
If i force unwrapping
the optionals a and b
, then the error will become,
unexpectedly found nil while unwrapping an Optional value
So the constant c
becomes,
let c = a ?? 10 * (b ?? d) //100
That's you should use parenthesis
around the default
value.
myDict[key]?.append(val) ?? (myDict[key] = [val])
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With