23029


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

もっとも単純なものは

[code]

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

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

[code]

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

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

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

[code]

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

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

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


CC BY-SA 3.0
2016-03-11T05:57:37.663
23019
2016-03-11T12:32:58.817
13404
question
swift
swiftである変数がnilなら値を入れる方法について


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

[code]

    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()
        }
    }
    
[/code]

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


CC BY-SA 3.0
2016-03-11T12:32:58.817
23029
2016-03-11T12:32:58.817
5519
23019
answer