6

時々、次のようなSwift 2コードを書いていることに気づきます。

class Test {
    var optionalInt: Int?
    var nonOptionalInt: Int = 0
    func test() {
        if let i = optionalInt {
            nonOptionalInt = i
        }
        // do more stuff
    }
}

問題のある部分は次のとおりです。

if let i = optionalInt {
    nonOptionalInt = i
}

つまり、optionalInt に値がある場合は、それを変数 nonOptionalInt に割り当て、それ以外の場合は何もしません。

if let iで中間変数を追加せずに、これをエレガントな1行で表現するSwift 2の同等の方法はありますか?

編集

最初の答えを熟考した後...

明らかに同等の方法があります

if optionalInt != nil {
    nonOptionalInt = optionalInt!
}

三項演算子 ? : 元のコードでは発生しない didSet をトリガーする可能性があるため、同等ではありません (これが意図された副作用である場合は適切です)。

これまでのところ最もエレガントな答えは

nonOptionalInt = optionalInt ?? nonOptionalInt

また、三項演算子のような didSet をトリガーする可能性があるため、同等ではありません (これが意図されている場合も同様です)。

Appleへの私の願いは次のようなものになると思います

nonOptionalInt = optionalInt ?? 

また

nonOptionalInt ??= optionalInt
4

3 に答える 3

10

あなたが探しているのはnil 結合演算子です。

この場合、次のように使用します。

nonOptionalInt = optionalInt ?? nonOptionalInt

編集

re: 質問に対する最後の編集:

Appleへの私の願いは次のようなものになると思います nonOptionalInt ??= optionalInt

...それをいつ構築できるかを望む理由は何ですか? :)

一般的なケースでこのようなことを推奨するかどうかを判断するのに十分なほど考えていませんが、状況に役立つ場合は、次のように要求することを行う??=オペレーターを作成できます。

infix operator ??= {}

func ??= <T>(inout lhs: T, rhs: T?) -> Void {
  guard let value = rhs else { return }
  lhs = value
}

次に、実際の動作を確認します。

let optionalNil: String? = nil,
  optionalValue: String? = "optionalValue",
  implicitlyUnwrappedNil: String! = nil,
  implicitlyUnwrappedValue: String! = "implicitlyUnwrappedValue"
var a = "a", b = "b", c = "c", d = "d"

a ??= optionalNil               // "a"
b ??= optionalValue             // "optionalValue"
c ??= implicitlyUnwrappedNil    // "c"
d ??= implicitlyUnwrappedValue  // "implicitlyUnwrappedValue"

(この定義は、クラス、構造体、またはその他の型の定義の外側で、最上位のスコープに追加することに注意してください)

于 2015-08-16T06:39:10.070 に答える