函数不 return true 除非我在需要它之前调用它一次

function doesn't return true unless I call it once before I need it

我有一个名为 iCloudIsOn() 的函数,它通过将 UserDefaults 键的值与预定义键的值进行比较来检查用户是否选择将 iCloud 与应用程序一起使用,然后我在我的初始视图控制器上使用它同步 iCloud 并实现下拉刷新,但前提是用户正在使用 iCloud,否则不需要此代码。

然而,奇怪的是,如果我在需要使用它之前调用它,即使只有一个 print(iCloudIsOn())

函数也只有 return 为真

函数本身如下所示:

func iCloudIsOn() -> Bool {    
    if UserDefaults.standard.url(forKey: "UDDocumentsPath") == iCloudPath { return true }
    else { return false }
}

然后在我初始的viewDidLoad下vc:

override func viewDidLoad() {
    super.viewDidLoad()

    if iCloudIsOn() {
        // sync iCloud
    }
}

但是这不会起作用,那时 iCloudIsOn() 将 return 为假,除非我在 if iCloudIsOn() 之前添加 print(iCloudIsOn()) { // 同步 iCloud }

我试着让 iCloudIsOn 在每次调用时打印 UserDefaults 键和 iCloudPath 的值,它们总是相同的:file:///private/var/mobile/Library/Mobile%20Documents/iCloud~cristian~thrive-storage/Documents/

所以我的代码中没有任何东西在某些时候改变其中之一的值(该值打印在 return 之前)。

知道为什么会这样吗?这与 UD 的工作方式有关,还是我遗漏了其他东西?我觉得有点奇怪,但我确定我只是在某个地方犯了错误。

提前致谢。

问题最终是 UserDefaults 第一次存储一个没有“/”的值,当与原始 URL、iCloudPathiCloudPath 进行比较时"/".

UserDefaults.standard.url(forKey: "UDDocumentsPath") = someURL

iCloudPath = someURL/

这只会在第一次复飞时发生。解决方法是同时覆盖这两个基础,因为您不知道自己在哪个基础上,尤其是当您在应用程序的一个会话中进行多项检查时。

if UserDefaults.standard.url(forKey: "UDDocumentsPath") == iCloudPath || UserDefaults.standard.url(forKey: "UDDocumentsPath").appendPathComponent("/") == iCloudPath

不过,从技术上讲,这是一种奇怪且意外的行为。