2016-08-31 4 views
3

を使用してパラメータをINOUTするためにデフォルト値を追加します。は、次の操作を行うことが可能であるスウィフト2でSwfit

class SomeType { 
    static let singletonInstance = SomeType() 

    func someFunction(var mutableParameter: SomeType = SomeType.singletonInstance) { 
     ... 
    } 
} 

しかしスウィフト3にvarキーワードがinoutの賛成で関数のパラメータのために削除されます。私はinoutキーワードを使用して上記と同じ結果を達成することができませんでした。

class SomeType { 
     static let singletonInstance = SomeType() 

     func someFunction(inout mutableParameter: SomeType = SomeType.singletonInstance) { 
      ... 
     } 
    } 

は、代わりに私がのエラー受信「タイプのデフォルト引数の値を 『SomeType』 『SomeType inoutの』型に変換することができない」、デフォルト値で inoutを使用することが可能であるかどうかである

私の質問?

+2

署名に 'var'を使うのは** inoutを使うのと同じではありません**。引数をローカル変数にしただけです。 – Moritz

+2

http://stackoverflow.com/questions/36164973/var-parameters-are-deprecated-and-will-be-removed-in-swift-3あなたの質問に答える必要があります。 –

答えて

4

あなたが話している2つのキーワード、inoutvarは非常に異なっています。 Apple Documentationから

次のよう

In-outパラメータが渡される:

  1. 関数が呼び出されると、引数の値がコピーされています。
  2. 関数本体では、コピーが変更されます。
  3. 関数が返ると、コピーの値が元の引数に割り当てられます。

それはinoutプロパティは完全に無用になるだろうとして、そこであなたは、inoutパラメータにデフォルト値を与えることはできません。あなたは何ができるか

はと、通常の(一定の)パラメータデフォルト値を受け取り、このよう(デフォルトのパラメータを追加してSwift Evolution's Removing var from Function Parameters Proposalからのコード、)同じ名前で新しいvarを宣言している。

func foo(i: Int = 5) { 
    var i = i 
    // now you can change i as you'd like 
} 
+0

引数 'i'が関数外の変数として存在し、その関数がその値を更新し、デフォルト値をインクルードしたい場合はどうしますか?スイフト3で可能ですか? – PlateReverb

+0

変数 '' i''が関数スコープ内にある場合、パラメータとして渡す必要はありません! :) http://swift.sandbox.bluemix.net/#/repl/58b8e0b2f09a045fe29a515c –

+0

デフォルトの値が必要な場合は、新しい値を返すのはどうでしょうか?ここの例:http://swift.sandbox.bluemix.net/#/repl/58b8e1ccf09a045fe29a515e –

0

デフォルトinoutパラメータを必要とする誰もがこのような解決策を検討して:あなたはパラメータのデフォルト値を指定すると

class SomeType { 
    static let singletonInstance = SomeType() 

    func someFunction(inout mutableParameter: SomeType) { 
     ... 
    } 

    // Declare function without 'mutableParameter': 
    func someFunction() { 
     someFunction(SomeType.singletonInstance) 
    } 
} 

を、 Swiftコンパイラはパラメータなしで自動的に関数を生成します。このソリューションでは、手動で行います。

関連する問題