这个函数/变量如何工作?

时间:2016-05-27 16:43:04

标签: ios swift

我正在使用以下代码检索NSURLCredentials

let credentials: NSURLCredential? = {
    let loginProtectionSpace = NSURLProtectionSpace(host: host, port: 0, protocol: NSURLProtectionSpaceHTTP, realm: nil, authenticationMethod: NSURLAuthenticationMethodDefault)
    let credentials = NSURLCredentialStorage.sharedCredentialStorage().defaultCredentialForProtectionSpace(loginProtectionSpace)
    return credentials
}()

用户打开应用程序时会调用此方法。返回的凭据为零。然后我设置这些凭据并尝试再次打印凭证,它仍然是零。但是,如果我重新启动应用程序,则会显示打印的凭据。这是怎么回事?

2 个答案:

答案 0 :(得分:1)

这是一个懒惰的变量。首次访问该属性时,代码将执行一次。在那之后,最初返回的值是"记住"并在将来的电话中返回。

如果您自己在NSURLCredentialStorage中设置凭据,那么在下次启动应用时,属性的第一次访问将再次执行代码并检索存储的凭据。请注意,在您首次设置凭据的运行期间,从存储中检索凭据的实际3行代码不会再次执行,因此在应用程序运行期间,属性仍为nil是存储中的值。如果您修改现有凭据,也会发生类似情况 - 在您更改它们的运行期间,credentials仍将保留对先前凭据的引用。

如果您希望能够重新查询商店,则应该

答案 1 :(得分:0)

我怀疑它是因为凭证是不可变的。代码块执行一次以为其分配凭证值。这就是重新启动应用程序后它具有凭据的原因。