无法将“任何”类型的值转换为指定的“布尔”类型-Xcode,Swift,iOS错误

时间:2019-12-27 02:09:26

标签: swift xcode ios13 swift5

我收到此错误:

1https://i.stack.imgur.com/RMsHY.png

有人知道如何解决此问题吗?谢谢!

var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    FirebaseApp.configure()


      let hasSession = UserDefaults.standard.value(forKey: "UserHasSubmittedPassword") ?? false

      let vc: UIViewController = {
                if hasSession {
                    // next vc you want to show
                } else {
                    // enter password vc
                }
      }()

      let navigationController = UINavigationController(rootViewController: vc)
      window?.rootViewController = navigationController
      window?.makeKeyAndVisible()
      return true


    }

4 个答案:

答案 0 :(得分:1)

UserDefaults类具有根据其类型检索对象的特定方法。

对于布尔值,您可以使用: UserDefaults.standard.bool(forKey: "UserHasSubmittedPassword")

从文档中:

  

此方法会自动强制某些“真实”值,例如   字符串“ true”,“ YES”和“ 1”,以及数字1和1.0-   布尔值true。某些“虚假”值也是如此,例如   如字符串“ false”,“ NO”和“ 0”,以及数字0和0.0,其中   被自动强制为布尔值false。

和:

  

与指定键关联的布尔值。如果指定   键不存在,此方法返回false。

这意味着您还不需要在示例代码中使用nil合并运算符??,因为如果键不存在,则使用方法UserDefaults.standard.bool(forKey:)已经返回false。 / p>

因此在您的示例代码中,您可以使用:

let hasSession: Bool = UserDefaults.standard.bool(forKey: "UserHasSubmittedPassword")

如果您还想读取其他类型的值,则UserDefaults类还具有用于读取String,URL,Array,Dictionary,Int,Float,Double等的特定方法。

完整列表可在此处找到:https://developer.apple.com/documentation/foundation/userdefaults

答案 1 :(得分:0)

尝试使用:

a[a < 2]

由于您要获取布尔值。

答案 2 :(得分:0)

切勿使用value(forKey:中的UserDefaults来获取单个值。对于标量类型,有object(forKey:和特殊的API,例如bool(forKey:)integer(forKey:)double(forKey:)

由于vc用作局部变量,因此使用闭包语法进行声明是不合适的。

只需直接检查UserDefaults中的布尔值。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    FirebaseApp.configure()

    let vc : UIViewController    
    if UserDefaults.standard.bool(forKey: "UserHasSubmittedPassword") {
       vc = <next vc you want to show>
    } else {
       vc = <enter password vc>
    }
    let navigationController = UINavigationController(rootViewController: vc)
    window?.rootViewController = navigationController
    window?.makeKeyAndVisible()
    return true
}

在关闭密码vc后,不要忘记为密钥true保存UserHasSubmittedPassword

答案 3 :(得分:-1)

@FoodDreams您可以尝试一下,希望它对您有帮助!

  1. 无论您在哪里设置,都首先像这样设置UserDefaults值

        UserDefaults.standard.set(true, forKey: "yourkeyname")
        UserDefaults.standard.synchronize()
    
  2. 在AppDelegate中编写以下函数,然后调用didFinishLaunching方法

    func setupRootVC()
    {
        var rootVC = UIViewController()
    
        if (UserDefaults.standard.value(forKey: "yourKey") as? Bool) != nil
        {
            rootVC = UIStoryboard.Dashboard.instantiateViewController(withIdentifier: "HomeVC") as! HomeVC
        }
        else
        {
            rootVC = UIStoryboard.Login.instantiateViewController(withIdentifier: "ChangePasswordVC") as! ChangePasswordVC
        }
    
        let rootNC = UINavigationController(rootViewController: rootVC)
        //all your further code
    }