在Swift中定义一个静态变量

时间:2016-07-02 20:35:17

标签: swift variables static swift2

我想在Swift 2.2中定义一个静态变量来保存NSDate对象。我尝试过以下方法:

static var interval:NSDate
var static interval:NSDate
var interval:static NSDate

没有工作。我在Objective-C中用正常的方式写了同样的东西:

static NSString* str

但是我还没有在Swift工作。

让我更清楚一点,我想在locationManager的didUpdateLocation方法中使用静态间隔,这样一个函数只会在五分钟后发生,但用户的位置仍然会实时看到。这就是我在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];

}

从我收集的内容中,我需要创建一个包含此静态NSDate变量的类,并在didUpdateLocations方法中实例化它。是? 谢谢!

2 个答案:

答案 0 :(得分:14)

在C中,

static <type> <name>;
文件级

定义范围限制为的变量name 相同的编译单元(粗略地说:到同一个源文件), 这同样适用于您的Objective-C代码

static NSString* str;

在Swift中,您可以使用private属性获得相同的效果 在文件级别定义:

private var date = NSDate()

date仅在同一源文件中可见, 比较Access Control 在Swift博客中。

在Swift中也可以使用函数作用域静态变量, 但你必须把它们放在一个结构中。例如:

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

print(foo()) // 1
print(foo()) // 2

答案 1 :(得分:4)

这里有两个问题:

  • staticclass成员仅允许在class内,
  • static成员需要初始化(或声明为可选,以nil初始化)。

示例:

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

请注意,Objective-C中不存在第一个限制:除了函数范围的静态变量之外,您还可以拥有独立的静态变量。