swiftである変数がnilなら値を入れる方法について

投稿者: Anonymous

タイトルのことを行いたいわけですが、やり方が何パターンかあります。

もっとも単純なものは

//パターン1
var str:String!
if str == nil{
    str = "newValue"
}

次に、オプショナルバインディングを用いた時

//パターン2
var str:String!
if let _ = str{
    //strがnilでないとき
}else{
    //strがnilのとき
    str = "newValue"
}

strがnilの時だけ値をいれたいので、else句以外は不要な上、冗長です。

次に、nil結合演算子を用いた時

//パターン3
var str:String!
str = str ?? "newValue"

この場合、とても簡潔に書けるのですが、strを二回書いてるところがなんだかダサいのです。

やはりパターン1がよいのでしょうか。
何か良い方法はありますか?

解決

演算子のオーバーロードは非常にセンスが要求されるので特にオススメするわけではありませんが、カスタムオペレータを定義することでRubyの||=と同じようにすることもできます。

infix operator ||= {
    associativity right
    precedence 90
    assignment
}

func ||=<T>(inout lhs: T?, @autoclosure rhs: () -> T) {
    if(lhs == nil) {
        lhs = rhs()
    }
}

func ||=<T>(inout lhs: T!, @autoclosure rhs: () -> T) {
    if(lhs == nil) {
        lhs = rhs()
    }
}

http://airspeedvelocity.net/2014/06/10/implementing-rubys-operator-in-swift/

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *