我想在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方法中实例化它。是? 谢谢!
答案 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)
这里有两个问题:
static
或class
成员仅允许在class
内,static
成员需要初始化(或声明为可选,以nil
初始化)。示例:
class Foo {
static var dt : NSDate = NSDate()
static var optDt : NSDate? = nil
}
请注意,Objective-C中不存在第一个限制:除了函数范围的静态变量之外,您还可以拥有独立的静态变量。