2016-07-02 15 views
4

Swift 2.2でNSDateオブジェクトを保持する静的変数を定義します。私は以下を試しました:Swiftで静的変数を定義する

何も起こっていません。私はObjective-Cで普通のものと同じことを書いてきました。

static NSString* str 

ただ、Swiftではうまくいきません。

もっと明確にするために、私はlocationManagerのdidUpdateLocationメソッドで静的な間隔を使用して、関数が5分後にのみ発生するようにしたいと考えていますが、ユーザーの場所はまだリアルタイムで表示されます。これは、この静的NSDate変数が含まれており、didUpdateLocations方法でそれをインスタンス化し、私は私が集まる何、私はクラスの報復を作成する必要があるだろうから、Objective Cの

-(void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations 
{ 
static NSDate *previous; //<--- This in Swift 
static int run = 0; 

CLLocation *location = locations.lastObject; 

if (run == 0 || [location.timestamp timeIntervalSinceDate:previous] > 10) 
{ 
    [_dbObj insert: location.coordinate.latitude : location.coordinate.longitude : [NSDate date] : location.timestamp]; 

    previous = location.timestamp; 

    run++; 
} 

MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(location.coordinate, 2*1609.34, 2*1609.34); 

[[self mapView] setRegion:viewRegion animated:YES]; 

} 

でそれをやった方法です。はい? ありがとう!

+4

最初の構文を使用してクラス内で 'static'プロパティを定義できます。しかし、あなたはこれをやろうとしていますか?Objective-Cの 'static'キーワードは、Swiftで許可されていないさまざまなスコープ(グローバル、そのコンパイル単位のみにアクセス可能にする、メソッド実装内のローカル変数)で使用できます。あなたは私たちに、これ以上コメントするためにこれをやろうとしているところを見せなければなりません。 – Rob

+1

[Swiftの静的プロパティ]の可能な複製(http://stackoverflow.com/questions/26567480/static-properties-in-swift) –

+0

これは関数スコープの静的変数であり、私の提案は機能するはずです。 - しかし、代わりにそれらを囲むクラスのインスタンス変数にしないでください。 –

答えて

2

は、ここでは二つの問題があります。

  • staticまたはclassメンバーのみclass内で許可されている、と
  • staticメンバーを初期化する(またはnilで初期化するには、オプションの宣言する)必要があります。

例:

class Foo { 
    static var dt : NSDate = NSDate() 
    static var optDt : NSDate? = nil 
} 

注最初の制限は、Objective-Cで存在しないこと:あなたは、静的変数スコープを機能に加えて、自立静的変数を持つことが許可されています。 Cにおいて

11

ファイルレベルで

static <type> <name>; 

スコープ に同じコンパイル単位(大別:同じソースファイルに)制限されている変数name定義 のと同じ適用をあなたのObjective-Cのコードスウィフトで

static NSString* str; 

に、あなたはprivateプロパティと同じ効果を得る ファイルレベルで定義:

private var date = NSDate() 

dateは、同じソースファイル内に表示され、 はスウィフトのブログでAccess Control を比較します。


機能は静的変数も同様スウィフトが可能であるスコープ、 いますが、構造体の内部でそれらを配置する必要があります。例:

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

print(foo()) // 1 
print(foo()) // 2 
+0

プライベートとスタティックは決して同じものではありません。プライベートは、スコープ、つまり可視性にのみ影響します。 Cファミリ言語の静的には、使用されるコンテキストに応じて多くの異なるセマンティクスがあります。ファイルスコープではprivateと似ていますが、クラススコープではクラス変数とインスタンス変数、サブルーチンスコープでは非スタックベースの永続値などを表します。 –

+1

@DavidBerry:そのため、レベル"。私は「クラススコープで静的」とは言及していませんでした(私が知る限り)。 * "ファイルスコープではプライベートと似ています" * - それは私が説明しようとしたものです。 –

+0

私の主張は@robと一致していたようですが、スコープについて何も言わないので、質問に答えるのに十分な情報がありません。私の前提は、実際にはスコープの機能について質問しているということです。 –

関連する問題