// これは展開できるから良いとして func f1(_ tpl: ([Int], [String])) { let fst: (Int?, String?) = tpl.map { $0.first } } // これもジェネリック型のまま展開できる func f2<T, U>(_ tpl: ([T], [U])) { let fst: (T?, U?) = tpl.map { $0.first } } // でもその変換が外部から来たら展開できない、こうか? func f3(_ tpl: ([Int], [String]), _ g: <A>(A) -> <B> B) { // #decltypeはC++からアイデアを借用 let fst: (#decltype(g(tpl.0)), #decltype(g(tpl.1)) = tpl.map(g) } // これもこう? func f4<T, U>(_ tpl: ([T], [U]), _ g: <A>(A) -> <B> B) { let fst: (#decltype(g(tpl.0), #decltype(g(tpl.1)) = tpl.map(g) }
(edited)