Swift在运行时评估错误的条件

时间:2018-04-24 08:29:41

标签: swift if-statement runtime

我面临以下问题:

我正在执行一个代码,其中swift必须检查这两个bool是否不同isVisiblevisible。值不同,但是当我打印print(isVisible != visible)时,它会给我false。我调试了代码行,当我执行po isVisible != visible时,它会给我true

我正在使用的代码:

func setTabbarVisible(_ visible: Bool) {
    guard let tabBar = tabBarController?.tabBar else {
        return
    }

    let anchorPoint = UIScreen.main.bounds.height - tabBar.frame.size.height
    let isVisible = (tabBar.frame.origin.y == anchorPoint)
    print("SUUU")
    print(isVisible != visible)
    if isVisible != visible {
        UIView.animate(withDuration: kAnimationDuration, animations: {
            if visible {
                tabBar.frame = CGRect(x: tabBar.frame.origin.x, y: anchorPoint, width: tabBar.frame.size.width, height: tabBar.frame.size.height)
                tabBar.alpha = kBarsAlpha
            } else {
                tabBar.frame = CGRect(x: tabBar.frame.origin.x, y: UIScreen.main.bounds.height, width: tabBar.frame.size.width, height: tabBar.frame.size.height)
                tabBar.alpha = 0
            }
        })


    }
}

我的调试终端:

Debug terminal screenshot.

正如我们所看到的,当我停止程序时,值是不同的,条件是真的,但是当我打印值或if语句评估时,条件给我错误。 (我试图在打印之前停止它,在if之前和当我停止它时,值总是相同的,所以它不能是因为并发)。

1 个答案:

答案 0 :(得分:0)

固定!

如果我将代码包装在DispatchQueue.main.async {}中,它可以正常工作。

但是我不明白为什么会发生这种情况,因为它在主线程中执行之前也是如此:

在使用DispatchQueue.main.async {}打包之前: Before wrapping it.

包装后:

After wrapping it

当我打印isVisiblevisible的值时,它返回true,但是当我调试它们时(在打印变量之后但在打印isVisible != visible之前)声明它给了我不同的价值观。)

        print( "print isVisible \(isVisible)")
        print ( "print visible \(visible)")
        print(( "print isVisible != visible \(isVisible != visible)"))
        if isVisible != visible {

输出:

Terminal output