2014年8月21日木曜日

[Swift] 関数引数としてのタプル

以前書いた「カリー化関数の話」という記事の後半で
言われてみれば確かに「関数の引数定義」は「タプルの名前付き定義」の書き方と同じ。
() は、もしかして「結合順序」と言うより、タプルの境界を定義するものと考えた方が良いのかも、しれない。
などと書いていたのだが、ようやくこれを試してみた(Xcode6-Beta6)。

例えば以下のような関数を定義したとする。
func f(a: Int, b: Int) {
    println("a + b = \(a + b)")
}
通常は次のように使う。
f(1, 2)
こうなると (1, 2) はタプルに見えてくるだろうと言うことで、タプルそのものを渡せるのか。結論から言うと渡すことが出来た。
let v = (1, 2)
f(v)
これはかなりナイス。

名前付き引数を要求されている場合なら、名前付きタプルで OK。
func f(#a: Int, #b: Int) {
    println("#a + #b = \(a + b)")
}

let  v = (a: 1, b: 2)
f(v)
あちこちで使うようなテクニックでは無いにしろ、使えるのは便利だし、関数の引数定義はタプルを拡張したものであるようなことが伺える。

しかしいくつかの制限も見られた。


まず、引数に渡せるタプルは let 宣言に限られていて、var 宣言のタプルはエラーになった。
しかしこれはキャストすれば回避可能であった。
func f1(a: Int, b: Int) {
    println("a + b = \(a + b)")
}
var v1 = (1, 2)
// f(v1)            // error: Missing argument for parameter #2 in call
f(v1 as (Int, Int)) // success
名前付き引数なら、当然名前付きタプルでキャストすれば良い。
func f2(#a: Int, #b: Int) {
    println("#a + #b = \(a + b)")
}
var v2 = (a: 1, b: 2)
// f(v2)                  // error: Missing argument for parameter 'b' in call
f(v2 as (a: Int, b: Int)) // success

次に、引数が1つの場合は名前付きタプルは文法上渡せなかった。
func f3(#a: Int) {
    println("#a = \(a)")    
}
let  v3 = (a: 1)
// f3(v3)             // error: Missing argument label 'a:' in call
// f3(v3 as (a: Int)) // error: Cannot create a single-element tuple with an element label

let  v4: (a: Int) = (a: 1) // error: Cannot create a single-element tuple with an element label
Beta6 からは単一要素のタプルには名前がつけられなくなっている。
上記の例では v3.a にはアクセスできない。

元々、(Int) という宣言は、単なる Int 型として見られていたので、これが Beta6 でより強化されたのだろう*1

名前付き引数でなければ問題はないし、単一要素をわざわざタプル化しないだろうから現実的に問題ではないと言って良い。


「関数引数 ≒ タプル」と見た場合、総合的にはまぁ想定の範囲内の結果。
気になるのは var タプルの場合のキャストくらい。しかしこれも正式版までにはまた変わりそうな気もする。

...
*1: 余談だが Beta5 までなら上記の f3(v3 as (a: Int)) と f3(v4) は成功を確認している。

2 件のコメント:

  1. Good, thanks for sharing! I know a lot of information from this article...
    Chia sẻ các bạn những cách trị gàu hiệu quả từ thiên nhiên cực hiệu quả tại nhà hay giải đáp thắc mắc về Tết Trung Thu tại nguồn gốc và ý nghĩa Tết Trung Thu cực thú vị hay chia sẽ các mẹ bầu sau sinh những cách giảm mỡ bụng sau sinh hiệu quả nhất đơn giản tại nhà, các mẹ bầu lưu ý thực phẩm kiêng kỵ khi mang thai hay khi bạn hóc xương cá thì phải làm sao tại mẹo chữa hóc xương cá cực hiệu quả, hay chia sẻ cách làm môi căng mọng đơn giản hiệu quả tại nhà, các bạn nữ lo lắng mông lép thì tham khảo mông lép phải làm sao cực thú vị.

    返信削除
  2. The Most Iconic Video Slots On The Planet - Jancasino
    The most iconic video slot is jancasino the 7,800-calibre slot poormansguidetocasinogambling machine ventureberg.com/ called Sweet wooricasinos.info Bonanza. This slot machine was developed in 2011, developed https://sol.edu.kg/ in the same studio by

    返信削除