読者です 読者をやめる 読者になる 読者になる

ぺぷしのーげん

アプリケーションエンジニア(C#er)による雑記ブログ

C#からオプショナル型を考える|Swift勉強録

f:id:hazakurakeita:20150902220743j:plain

ぱくたそ - フリー写真素材・無料ダウンロード

大学ではC言語、会社ではC#という10年間だったのでSwiftという新言語に若干苦戦しております。その中で軽視しがちなオプショナル型。なんでNullが可能かどうか(SwiftではNilですね)を明示しないといけないのか、ここって結構味噌なんですかね。今日はメモがてらオプショナル型について簡単にまとめます。詳しく知らべたい方は下記の記事をみれば良いと思います。

qiita.com

 

昨日ちょっとだけ困った場面

C#だと下記のようなコードを書くことってあるかと思います。もしかしたらオプショナル型というのはこのout修飾子のような概念を広く一般化したものと考えると良いかもしれないですね。

    string str;
    if(!method(str)) return
    ...
    }
    
    private bool method(out string str){
    ...

 ここでメソッドの引数がout修飾子ではなくref修飾子だとビルドエラーになりますね。これと同じコードをSwiftで書いてみました。

    var str: String
    if(!method(str)) return
    ...
    }
    
    private func method(str: String) -> Bool {
    ...

 これエラーが発生してコンパイルもできません。しかもエラー内容がクラスにイニシャライザーを追加しろというメッセージなので、最初気が付きませんでした笑。下記のように修正すればOKです。

    var str: String?
    if(!method(str)) return
    ...
    }
    
    private func method(str: String) -> Bool {
    ...

 変数strをオプショナル型にするだけ!当然といえば当然です。だってC#でもout修飾子を使ってますよね。Swiftでも何らかの明示が必要と考えると納得。

 

 しかし使いこなせるようになるには時間が必要

C++もC#もJavaもオプショナル型というのはありません。Nullをプログラマがコードで制御するというのが常識になってしまっていると、このオプショナル型の取り扱いは戸惑ってしまいますね。逆に初めてプログラミングを習得する人には良いかもしれない。そういう人はAndroidアプリ開発で苦労するかも。Swift以外の言語では下記のように制御することが多いですから。

    // Case.1
    if(str!=null) break;
    str += "_test";
    
    // Case.2
    try
    {
      str += "_test";
    }
    catch(NullReferenceException ex)
    {
      ...
    }

 結局慣れですなー。

 

おしまい。