【问题标题】:Define a static variable in Swift在 Swift 中定义一个静态变量
【发布时间】:2016-07-02 20:35:17
【问题描述】:

我想在 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 方法中对其进行实例化。是的? 谢谢!

【问题讨论】:

  • 您可以使用第一种语法在类中定义static 属性。但是你在哪里尝试这样做? Objective-C static 关键字可以在 Swift 中不允许的不同范围内使用(全局,使其只能被该编译单元访问;方法实现中的局部变量)。您必须向我们展示在哪里您尝试这样做,以便我们进一步发表评论。
  • 这是函数范围的静态变量,我的建议应该可行。 – 但是为什么不让它们成为封闭类的实例变量呢?

标签: swift variables static swift2


【解决方案1】:

在 C 中,

static <type> <name>;

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

static NSString* str;

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

private var date = NSDate()

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


Function scoped 静态变量在 Swift 中也是可能的, 但是您必须将它们放在结构中。示例:

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

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

【讨论】:

  • 私有和静态绝对不是一回事。 Private 仅影响范围,即可见性。 C 系列语言中的静态具有许多不同的语义,具体取决于使用它的上下文。在文件范围内它类似于私有,在类范围内它表示一个类变量与一个实例变量,在子程序范围内它表示一个持久的非基于堆栈的值,等等。
  • @DavidBerry:这就是为什么我明确地说“文件级别的静态”。我没有提到“类范围内的静态”(据我所知,这个问题也没有)。 “在文件范围内,它类似于私有”, – 这正是我试图解释的内容。
  • 我想我的观点与@rob 一致,没有足够的信息来回答这个问题,因为他们对范围只字未提。我的假设是/实际上是他们在询问作用域的函数......
  • @DavidBerry:您的假设似乎是对的,问题是关于函数范围的静态变量。我已经相应地更新了答案。
  • Vehicle().car = "Mercedes", Vehicle().car, 给 Lexus ,但是,让 vehObj = Vehicle(); vehObj.car,给 Mercedes 。我不知道为什么。有什么区别?你能指导我吗?
【解决方案2】:

这里有两个问题:

  • staticclass 成员只能在 class 内使用,并且
  • static 成员需要初始化(或声明为可选以使用 nil 进行初始化)。

例子:

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

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

【讨论】:

    猜你喜欢
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    • 2014-04-01
    • 2018-03-22
    • 1970-01-01
    相关资源
    最近更新 更多