web-dev-qa-db-ja.com

Swiftの静的関数変数

私は、Swiftの関数にローカルでのみスコープされた静的変数を宣言する方法を見つけようとしています。

Cでは、これは次のようになります。

int foo() {
    static int timesCalled = 0;
    ++timesCalled;
    return timesCalled;
}

Objective-Cでは、基本的に同じです。

- (NSInteger)foo {
    static NSInteger timesCalled = 0;
    ++timesCalled;
    return timesCalled;
}

しかし、私はSwiftでこのようなことをすることはできないようです。次の方法で変数を宣言しようとしました。

static var timesCalledA = 0
var static timesCalledB = 0
var timesCalledC: static Int = 0
var timesCalledD: Int static = 0

しかし、これらはすべてエラーになります。

  • 最初の文句は、「静的プロパティは型でのみ宣言できる」というものです。
  • 2番目は、「予想される宣言」(staticがどこにあるか)と「予想されるパターン」(timesCalledBがどこにあるか)に文句を言います。
  • 3番目の文言は、「行の連続するステートメントは「;」で区切る必要がある」(コロンとstaticの間のスペース内)および「期待されるタイプ」(staticはどこ)
  • 4番目の文句は、「行の連続するステートメントは「;」で区切る必要がある」(Intstaticの間のスペース)と「期待される宣言」(等号の下)
86
nhgrif

Swiftは、クラス/構造体にアタッチせずに静的変数をサポートするとは思わない。静的変数でプライベート構造体を宣言してください。

func foo() -> Int {
    struct Holder {
        static var timesCalled = 0
    }
    Holder.timesCalled += 1
    return Holder.timesCalled
}

  7> foo()
$R0: Int = 1
  8> foo()
$R1: Int = 2
  9> foo()
$R2: Int = 3
138
Bryan Chen

別の解決策

func makeIncrementerClosure() -> () -> Int {
    var timesCalled = 0
    func incrementer() -> Int {
        timesCalled += 1
        return timesCalled
    }
    return incrementer
}

let foo = makeIncrementerClosure()
foo()  // returns 1
foo()  // returns 2
22
monadis

Xcode 6.3を搭載したSwift 1.2は、期待どおりに静的をサポートするようになりました。 Xcode 6.3ベータリリースノートから:

「静的」メソッドとプロパティがクラスで許可されるようになりました(「クラス最終」のエイリアスとして)。グローバルストレージを持ち、最初のアクセスで遅延的に初期化される(グローバル変数のように)クラスで静的なストアドプロパティを宣言できるようになりました。プロトコルは、タイプ要件を「クラス」要件として宣言するのではなく、「静的」要件として宣言するようになりました。 (17198298)

関数には静的な宣言を含めることはできないようです(質問されています)。代わりに、クラスレベルで宣言を行う必要があります。

クラス関数は必須ではありませんが、クラス(静的とも呼ばれます)関数内でインクリメントされる静的プロパティを示す簡単な例:

class StaticThing
{
    static var timesCalled = 0

    class func doSomething()
    {
        timesCalled++

        println(timesCalled)
    }
}

StaticThing.doSomething()
StaticThing.doSomething()
StaticThing.doSomething()

出力:

1
2
3
18
Daniel

別の解決策

class Myclass {
    static var timesCalled = 0
    func foo() -> Int {
        Myclass.timesCalled += 1
        return Myclass.timesCalled
    }
}
0
J.q