2016-05-21 29 views
6

posso destrutturare una tupla di tuple facilmente:destrutturazione tupla di tuple in chiusura

let tt = (2, (3, 4)) 

let (a, (b, c)) = tt 
b // => 3 

mi piacerebbe fare la stessa cosa quando si dichiara una chiusura, per esempio ho pensato che avrei potuto scrivere:

[tt].map { (a, (b, c)) in 
    // Use b 
} 

XCode si lamenta con "I parametri senza nome devono essere scritti con il nome vuoto".

unico modo che ho ottenuto al "lavoro" era:

[tt].map { (a, tuple: (b: Int, c: Int)) in 
    // Use tuple.b 
} 

Questo ha due svantaggi mi piacerebbe evitare:

  • ho bisogno di usare tuple.b invece di b
  • Devo specificare i tipi di b e c

BTW, il mio caso d'uso è che io voglio fare un reduce con indice in modo che sto cercando utilizzando array.enumerate().reduce

+2

http://thread.gmane.org/gmane.comp.lang.swift.evolution/ 16190 – jtbandes

+0

Ho iniziato la discussione e presenterò una proposta la prossima settimana. :) – HAS

risposta

1

Questo soddisfa il vostro primo requisito, ma ancora richiedono di aggiungere tipo annonation:

typealias TupleType = (a: Int, tuple: (b: Int, c: Int)) 

let tt: TupleType = (2, (3, 4)) 

[tt].map { 
    print($0.tuple.b) 
} 
2

Con un riga di assegnazione aggiuntiva, è possibile assegnare i valori nella matrice di (a, (b, c)) decostruire tupla:

let tt1 = (2, (3, 4)) 
let tt2 = (5, (6, 7)) 

[tt1, tt2].map { tt in 
    let (a, (b, c)) = tt 
    print(b) 
} 

uscita:

012.
3 
6 

alternativa:

[tt1, tt2].map { 
    let (a, (b, c)) = $0 
    print(b) 
} 
+0

Puoi anche cambiare stilisticamente il tuo secondo modulo per mettere il 'let' sulla stessa linea del controvento, quindi si avvicina al normale modulo' myVar in'. –

0

Un'altra soluzione:

[tt].map { a, b in 
    let (b, c) = b 
    print(a, b, c) 
}