我正在使用以下代码来检索 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
}()
这会在用户打开应用时调用。返回的凭据为零。然后我设置这些凭据并尝试再次打印凭据,但它仍然是零。但是,如果我重新启动应用程序,打印的凭据就在那里。这是怎么回事?
最佳答案
这是一个惰性变量。当您首次访问该属性时,代码将执行一次。之后,最初返回的值被“记住”并在以后的调用中返回。
如果您自己在 NSURLCredentialStorage
中设置凭据,那么在下次启动应用程序时,第一次访问该属性会再次执行代码并检索存储的凭据。请注意,在您第一次设置凭据的运行期间,从存储中检索凭据的实际 3 行代码不会执行第二次,因此在该应用程序运行期间,该属性仍然是 nil
而实际上存储中有一个值。如果您修改现有凭据,则会发生类似的事情 - 在您更改它们的运行期间,凭据
仍将保留对先前凭据的引用。
如果您希望能够重新查询商店,您应该要么
- 为此创建一个函数而不是惰性变量
- 或者看看这个答案:Re-initialize a lazy initialized variable in Swift
关于ios - 这个函数/变量是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37488581/