【问题标题】:Convert any object to boolean in swift?快速将任何对象转换为布尔值?
【发布时间】:2016-09-22 07:02:38
【问题描述】:

我从服务器得到一个字典作为 JSON 响应。从那个字典中有一个键 "error" 现在我想获取 "error" 键的值。我知道错误总是会可以是 01。所以我尝试将其设为布尔值,但它对我不起作用。请建议我如何将其值转换为布尔值。

  let error=jsonResult.objectForKey("error")
  //this does not work for me
   if(!error)
  {
      //proceed ahead
   }

【问题讨论】:

  • error 转换为布尔类型
  • 改变这个jsonResult.objectForKey("error").boolValue

标签: ios iphone swift xcode


【解决方案1】:

Bool 不包含可以将Int 转换为Bool 的初始化程序。因此,要将Int 转换为Bool,您可以创建一个extension,即

extension Bool
{
    init(_ intValue: Int)
    {
        switch intValue
        {
        case 0:
            self.init(false)
        default:
            self.init(true)
        }
    }
}

现在您可以使用以下方法获取键错误的值:

if let error = jsonResult["error"] as? Int, Bool(error)
{
// error is true
}
else
{
// error does not exist/ false.
}

【讨论】:

  • 您可以将整个开关替换为 self = intValue == 0 :)
【解决方案2】:

更新

将 jsonResult 视为NSDictionary,错误值为Bool。您可以通过以下方式查看。

guard let error = jsonResult.object(forKey: "error") as? Bool else{
    // error key does not exist / as boolean
    return
}

if !error {
    // not error
}
else {
    // error
}

【讨论】:

  • 谢谢,是的,效果更好。我发现的一件事是,在某些字典中,布尔值以字符串形式出现,需要进行字符串转换并检查“真”。
  • 键值取决于json的构建方式。我们可以设置为字符串/布尔/整数。
【解决方案3】:

非常简单的方法: [更新 Swift 5]

创建一个函数:

func getBoolFromAny(paramAny: Any)->Bool {
    let result = "\(paramAny)"
    return result == "1"
}

使用函数:

if let anyData = jsonResult["error"] {
    if getBoolFromAny(anyData) {
        // error is true
    } else {
        // error is false
    }
}

另外,如果你想要一个行条件,那么上面的函数可以简化为:

if let anyData = jsonResult["error"], getBoolFromAny(anyData) {
    // error is true
} else {
    // error is false
}

【讨论】:

  • 我保留了原始答案,因为问题提到返回 JSON 包含该值的 0 或 1。但是,更通用的函数将是可接受的响应:return paramAny as? Bool ?? false
【解决方案4】:

您的错误既不是 0 也不是 1。它是一个可选对象。如果您的 JSON 中没有关键“错误”,则为 nil,否则可能是 NSNumber。

很可能 nil 表示“没有错误”,如果它不是 nil 并且包含零则表示“没有错误”,如果它不是 nil 并且包含 1 则表示“错误”,如果它不是 nil 并且包含其他任何事情,然后您的 json 出现严重问题。

试试这个:

let errorObject = jsonResult ["error"]
if errorObject == nil or errorObject as? NSInteger == 0 

当我说“尝试”时,我的意思是“尝试”。你是这里负责任的开发者。检查它是否与不包含错误的字典、包含错误 0 或 1 的字典以及包含例如 error = "This is bad" 的字典一起工作。

【讨论】:

    【解决方案5】:

    改为检查 error0 之间的相等性:

    let error = jsonResult.objectForKey("error")
    
    if error == 0 {
        // proceed
    }
    

    【讨论】:

    • 谁说的?编译器还是你?
    • @deepakkumar 如果它是一个整数开头,你的原始代码应该可以工作......
    【解决方案6】:

    这里的另一个重点是,您正在使用 Swift 并将响应解析为 NSDictionary。我可以这么说是因为您使用的是objectForKey 方法。最佳做法是将其解析为 Swift Dictionary

    它可能看起来像 Dictionary<String:AnyObject>[String:AnyObject]

    然后你可以检查错误:

      if let error = jsonResult["error"] where error == 0 {
        //your code
      }
    

    【讨论】:

      【解决方案7】:

      下面的代码对我有用

       if let error = jsonResult["error"] as? Int where Bool(error)
        {
                  // error is true
                 print("error is true")
        }
        else
        {
            // error does not exist/ false.
            print("error is false")
        }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-28
        • 1970-01-01
        • 1970-01-01
        • 2018-12-02
        • 2012-06-08
        • 1970-01-01
        • 2010-12-05
        • 2019-03-17
        相关资源
        最近更新 更多