【问题标题】:Can't save Bool in Swift无法在 Swift 中保存 Bool
【发布时间】:2018-11-15 15:09:44
【问题描述】:

我是 Swift 新手(C++ 背景),我正在尝试做一件非常简单的事情:保存一个 Bool。如果我将 bool 转换为 "A" 或 "B" 的字符串,然后再转换回来,它可以完美地工作,但是如果我直接使用 encode 和 aDecoder 保存 bool,则 Bool 每次都会返回 nil。在互联网上找不到任何关于它的信息。

正如您在下面看到的,我只需将字符串替换为 Bool 即可。

func boolwontsave(aBool:Bool) -> String {
    if aBool {
        return "A"
    }
    return "B"
}

func encode(with aCoder: NSCoder) {

    aCoder.encode(name, forKey: PropertyKey.name)
    aCoder.encode(number, forKey: PropertyKey.number)
    aCoder.encode(boolwontsave(aBool: ispresent), forKey: PropertyKey.present)

}

required convenience init?(coder aDecoder: NSCoder) {

    // The name is required. If we cannot decode a name string, the initializer should fail.
    guard let name = aDecoder.decodeObject(forKey: PropertyKey.name) as? String else {
        os_log("Unable to decode the name for a player object.", log: OSLog.default, type: .debug)
        return nil
    }

    let number = aDecoder.decodeObject(forKey: PropertyKey.number) as? String

    guard let localpresent = aDecoder.decodeObject(forKey: PropertyKey.present) as? String else {
        print("got the nil")
        os_log("Unable to decode the ispresent for a player object.", log: OSLog.default, type: .debug)
        return nil
    }


    // Must call designated initializer.
    self.init(name:name, number:number, present: localpresent == "A")

}

布尔值不应该保存吗?这似乎不优雅。

【问题讨论】:

  • 你说“保存一个布尔值”是什么意思。另外请提供一个代码,您尝试检索您的布尔值并返回 nil。
  • 一个更大的问题是你为什么在 Swift 中使用 NSCodingNSCoder。您没有使用 Swift Codable 功能是否有原因?

标签: swift nscoding


【解决方案1】:

如果您使用正确的 API,保存 Bool 非常容易。

NSCoding而言Bool不是一个对象,有一个decodeBool(forKey方法。

required convenience init?(coder aDecoder: NSCoder) {

    // The name is required. If we cannot decode a name string, the initializer should fail.
    guard let name = aDecoder.decodeObject(forKey: PropertyKey.name) as? String else {
        os_log("Unable to decode the name for a player object.", log: OSLog.default, type: .debug)
        return nil
    }

    let number = aDecoder.decodeObject(forKey: PropertyKey.number) as? String
    let localpresent = aDecoder.decodeBool(forKey: PropertyKey.present)

    // Must call designated initializer.
    self.init(name:name, number:number, present: localpresent)

}

func encode(with aCoder: NSCoder) {
    aCoder.encode(name, forKey: PropertyKey.name)
    aCoder.encode(number, forKey: PropertyKey.number)
    aCoder.encode(ispresent, forKey: PropertyKey.present)
}

在 Swift 4+ 中,我更喜欢原生的 Codable 协议而不是受限的 NSCoding

  • NSCoding 需要一个继承自 NSObject
  • Codable 可用于任何符合协议的结构、类和枚举。

【讨论】:

  • 感谢所有快速回答。我将转换为使用 Codable,我认为这也将解决我在保存嵌套数组方面的其他挑战。再次感谢大家!
【解决方案2】:

使用 decodeBool(forKey key: String) 代替 decodeObject(forKey: String)

DecodeBool 解码并返回一个布尔值,该值之前使用 encode(_:forKey:) 编码并与字符串键相关联。

aCoder.encode(true, forKey: PropertyKey.present)
aCoder.decodeBool(forKey: PropertyKey.present)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-03
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 2012-02-11
    相关资源
    最近更新 更多