swift - 无法在 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")
}
布尔人不应该保存吗?这似乎不优雅。
解决方案
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
可用于任何符合协议的结构、类和枚举。
推荐阅读
- python - 我应该如何存储它,我该怎么做?不和谐.py
- swift - Swift shell 命令返回空结果
- python - TensorFlow - ValueError:检查点版本应为 V2
- c - 寻找素因数分解的程序
- javascript - 隐藏的 Tailwind 移动设备无法正常工作
- powershell - 如何使用 AWS PS Cmdlet 按标签搜索:Get-EC2Subnet
- visual-studio-code - 如何找到每个版本的 Visual Studio Code 附带的节点版本
- docker - Jenkins Pipeline - 使用 SSH 凭据连接到 Docker 主机
- sql-server - SQL Server 2019 的 TempDB 缓存问题
- angular9 - 默认情况下,Angular 8 Material mat-error 在加载时显示