5

Swift 2 では、次のことが可能です。

class SomeType {
    static let singletonInstance = SomeType()

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

ただし、Swift 3 では、var関数パラメーターのキーワードが削除され、inout. inoutキーワードを使用して上記と同じ結果を達成できませんでした。

class SomeType {
        static let singletonInstance = SomeType()

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

代わりに、「型 'SomeType' の既定の引数値を型 'inout SomeType' に変換できません」というエラーが表示されます。

私の質問はinout、デフォルト値で使用できるかどうかです。

4

3 に答える 3

6

あなたが話している 2 つのキーワードinoutvar, は大きく異なります。

アップルのドキュメントから:

In-outパラメータは次のように渡されます。

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

したがって、プロパティがまったく役に立たなくinoutなるため、パラメータにデフォルト値を与えることはできません。inout

あなたができることは、デフォルト値を持つvar通常の(定数)パラメータを受け取り、この方法で同じ名前の新しいものを宣言することです( Swift Evolutionの関数パラメータから変数を削除する提案からのコード、デフォルトパラメータの追加):

func foo(i: Int = 5) {
    var i = i
    // now you can change i as you'd like
}
于 2016-08-31T09:35:12.967 に答える
0

デフォルト値を「エミュレート」するために、2 番目の関数シグネチャを作成できます。

func foo() {
    var v: Int = 0 // your default value
    foo(bar: &v)
}

func foo(bar: inout Int) {
    // do stuff
}
于 2020-12-06T08:50:36.157 に答える