私は、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
しかし、これらはすべてエラーになります。
static
がどこにあるか)と「予想されるパターン」(timesCalledB
がどこにあるか)に文句を言います。static
の間のスペース内)および「期待されるタイプ」(static
はどこ)Int
とstatic
の間のスペース)と「期待される宣言」(等号の下)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
別の解決策
func makeIncrementerClosure() -> () -> Int {
var timesCalled = 0
func incrementer() -> Int {
timesCalled += 1
return timesCalled
}
return incrementer
}
let foo = makeIncrementerClosure()
foo() // returns 1
foo() // returns 2
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
別の解決策
class Myclass {
static var timesCalled = 0
func foo() -> Int {
Myclass.timesCalled += 1
return Myclass.timesCalled
}
}