使用 Codable 使用 Swift 归档
Posted
技术标签:
【中文标题】使用 Codable 使用 Swift 归档【英文标题】:Using Codable to archiving with Swift 【发布时间】:2019-01-11 00:54:37 【问题描述】:我正在尝试使用可编码的 swift 从 ios 应用程序中的 textFields 中保存一些数据,但是当我定义归档函数时,xcode 告诉我“无法推断通用参数‘值’”。
我正在学习存档,如果有人可以帮助我,我将非常感激。
这是我正在使用的代码
class ProfileViewController: UITableViewController
var currentProfile: Profile?
@IBOutlet weak var name: UITextField!
@IBOutlet weak var surname: UITextField!
@IBAction func saveProfileButton(_ sender: Any)
addCurrentProfile()
saveProfile()
func addCurrentProfile()
currentProfile?.name = name.text ?? ""
currentProfile?.surname = surname.text ?? ""
struct Profile
var name: String
var surname: String
enum CodingKeys: String, CodingKey
case name
case surname
init(name:String, surname:String)
self.name = name
self.surname = surname
func encode(to encoder: Encoder) throws
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(name, forKey: .name)
try container.encode(surname, forKey: .surname)
init(from decoder: Decoder) throws
let container = try decoder.container(keyedBy: CodingKeys.self)
name = try container.decode(String.self, forKey: .name)
surname = try container.decode(String.self, forKey: .surname)
func saveProfile()
do
let data = try PropertyListEncoder().encode(currentProfile)
let success = NSKeyedArchiver.archiveRootObject(data, toFile: profile_data.path)
print(success ? "Successful save" : "Save Failed")
catch
print("Save Failed")
【问题讨论】:
【参考方案1】:首先是让你的结构确认Codable
协议,例如:
struct Profile:Codable
var name: String
var surname: String
enum CodingKeys: String, CodingKey
case name
case surname
init(name:String, surname:String)
self.name = name
self.surname = surname
func encode(to encoder: Encoder) throws
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(name, forKey: .name)
try container.encode(surname, forKey: .surname)
init(from decoder: Decoder) throws
let container = try decoder.container(keyedBy: CodingKeys.self)
name = try container.decode(String.self, forKey: .name)
surname = try container.decode(String.self, forKey: .surname)
然后,您可以使用PropertyListEncoder
来实现对象,如下所示:
func saveProfile()
do
let data = try PropertyListEncoder().encode(currentProfile)
let success = NSKeyedArchiver.archiveRootObject(data, toFile: profile_data.path)
print(success ? "Successful save" : "Save Failed")
catch
print("Save Failed")
【讨论】:
【参考方案2】:这里似乎有几个问题。 直接回答您的问题: “无法推断通用参数‘值’”。 是:您忘记添加协议:
struct Profile: Codable
...
【讨论】:
以上是关于使用 Codable 使用 Swift 归档的主要内容,如果未能解决你的问题,请参考以下文章
NSKeyedArchiver 不归档我的 Codable 类
如何使用 Codable 和 Swift 解析这个嵌套的 JSON?
Swift 4:使用 Codable `Generic parameter 'T' cannot be inferred`