Objective-CのブロックとSwiftのクロージャー

注意: この記事は1年以上前に掲載されたものです。情報が古い場合がありますのでお気を付け下さい。

iOSのアプリ開発において、Objective-Cではブロック、Swiftではクロージャーが往々にして使われる。これらはそのメソッド内しか使わないような関数のコールバック処理などで効力を発揮するものであり、是非とも覚えておきたいものである。

Objective-Cのブロック

Objective-C ((正確にはC言語のアップル拡張機能なのだが、この項目ではObjective-Cの機能として扱う)) では、ブロックとして表現することができる。

例えば、処理中には以下のような書き方ができる。

int (^getMax)(int, int) = ^(int a, int b) {
    if (a > b) {
        return a;
    } else {
        return b;
    }
};

上記のコードは以下のようにして呼び出すことができる。

getMax(3, 5);

この場合は、5がreturnされる。

なお、Objective-Cにおいては、その言語仕様上、型の指定などでかなり複雑になるので要注意である。

Swiftのクロージャー

Swiftでは、ブロックの代わりにクロージャーが実装されているので、それを利用することで実現可能である。

Objective-Cで書かれたコードは、以下のように表現できる。

let getMax = { (_ a: Int, _ b: Int) -> Int in
    if a > b { 
        return a
    } else {
        return b
    }
}

この場合も、getMax(3, 5)で5がreturnされる。

最近ではmacOSやiOSのプログラムではブロックやクロージャーを多用する傾向もあるので、是非とも使いこなしていきたいものである。

タイトルとURLをコピーしました