El parámetro genérico 'Elemento' no se pudo inferir al agregar a Array

Tengo un dictionary de matrices:

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

Para poblarlo, bash agregar un valor a la matriz en el índice correcto. Si la matriz no existe, falla y hago una nueva matriz en ese índice:

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

Creo que debería poder acortar esto para:

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

Sin embargo, en su lugar aparece el error: el Generic parameter 'Element' could not be infernetworking . ¿Por qué?

Swift 3.0

Considere el concepto simple:

Si se usa if...else en una sola línea, las operaciones deben ser simples o, de lo contrario, tenemos que aparear operaciones bajo parenthesis para que sea una sola operación, en nuestro caso, append(val) es una operación única, pero myDict[key] = [val] es múltiple ( myDict[key] es one y = assignment es one y [val] es one) por lo que los agrupamos en single usando parenthesis .

De una manera más simple, considere las siguientes 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 

Aquí, estamos instruyendo al comstackdor no es una forma esperada en let a .

Ver también,

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

Aquí let c es una instrucción incorrecta, el error es,

Valor del tipo opcional 'Int?' no desenvuelto; ¿quiso usar '!' o '?'

Si unwrapping los optionals a and b , entonces el error se convertirá,

inesperadamente encontrado nulo mientras desenvuelve un valor opcional

Entonces, la constante c convierte,

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

Eso es lo que debe usar parenthesis alnetworkingedor del valor default .

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

Es mejor hacer esto:

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

Elimina la array de myDict antes de la mutación, por lo que esa array será la única reference a la memory de la matriz. Debido a que tiene una reference única, se pueden realizar operaciones mutables sin tener que copyr la memory de la matriz.

Sin esto, cada myDict[key]?.append(val) provoca una operación de copy en escritura.