swift: array for-each

Swiftにはfor-eachがあるから古典for文のようにindexで回すよりはずっといいが、せっかくなのでRubyよろしくeachでブロックを渡すような文法もあればいいのにと思ったりする。

そこで演算子オーバーロードだ。

infix operator / { associativity left precedence 95 }
func / (lhs:Array<T>, rhs: T->Void) -> Array<T> {
    for i in lhs
    {
        rhs(i)
    }
    return lhs
}

やりたいことはeachだから値を返す必要はないが、連鎖的に処理できると面白そうなので元の配列を返すことにしてみた。つまり、配列に保持されたオブジェクトに対して副作用を次々加えていくスタイルである。

class C {
    var val: Int
    init(v: Int)
    {
        val = v
    }
}

let l = [C(v:1), C(v:2), C(v:3)]
l / { o in o.val *= 2 } / { o in o.val += 3 }
l // => [(val 5) (val 7) (val 9)

これ、/は適当かな?SwiftはUnicodeも演算子にできるから、「♪」とか定義してもいいのだが。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です