我是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")
}
布尔人不应该保存吗?这似乎不雅。
答案 0 :(得分: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
继承的 class 。Codable
可用于符合协议的任何结构,类和枚举。答案 1 :(得分:1)
使用decodeBool(forKey键:字符串)而不是decodeObject(forKey:字符串)
DecodeBool解码并返回一个布尔值,该布尔值先前已使用encode(_:forKey :)编码并与字符串键相关联。
aCoder.encode(true, forKey: PropertyKey.present)
aCoder.decodeBool(forKey: PropertyKey.present)