无法在 Swift 中保存 Bool

Sam*_*rth 3 nscoding swift

我是 Swift 新手(C++ 背景),我正在尝试做一件非常简单的事情:保存 Bool。如果我将 bool 转换为“A”或“B”字符串,然后再转换回来,它会完美地工作,但如果我直接使用编码和 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")

}
Run Code Online (Sandbox Code Playgroud)

布尔斯不是应该拯救吗?这看起来很不优雅。

小智 5

使用decodeBool(forKey key: String) 而不是decodeObject(forKey: String)

DecodeBool 解码并返回先前使用encode(_:forKey:) 编码并与字符串键关联的布尔值。

aCoder.encode(true, forKey: PropertyKey.present)
aCoder.decodeBool(forKey: PropertyKey.present)
Run Code Online (Sandbox Code Playgroud)