无法在Swift中保存布尔

时间:2018-11-15 15:09:44

标签: swift nscoding

我是Swift的新手(在C ++中为背景),我正在尝试做一个非常简单的事情:保存一个布尔。如果我将布尔值转换为“ A”或“ B”的字符串,然后再转换回去,则效果很好,但是如果我直接使用encoding和aDecoder保存布尔值,则布尔型函数每次都返回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")

}

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

2 个答案:

答案 0 :(得分:1)

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

对于NSCodingBool不是不是对象,有一种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继承的 class
  • Codable可用于符合协议的任何结构,类和枚举。

答案 1 :(得分:1)

使用decodeBool(forKey键:字符串)而不是decodeObject(forKey:字符串)

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

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