首页 > 解决方案 > 无法在 Swift 中保存 Bool

问题描述

我是 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")

}

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

标签: swiftnscoding

解决方案


Bool如果您使用正确的 API,则很容易保存 a 。

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协议而不是 constrained NSCoding

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

推荐阅读