ios - 如何创建包含符合协议的对象的元组?
问题描述
假设我想使用 JSON 资源测试一堆类型的序列化:
let bundle = Bundle(for: type(of: self))
let decoder = JSONDecoder()
let tests : [(filename: String, type: ???)] = [
("Employee", Employee.self),
("Job", Job.self)
]
for test in tests {
let filename = test.filename
let type = test.type
guard let url = bundle.url(forResource: filename, withExtension: "json") else {
XCTFail("Failed to load file: \(filename).json")
return
}
do {
let data = try Data(contentsOf: url)
let json = try JSONSerialization.jsonObject(with: data, options: [])
let obj = try decoder.decode(type, from: data)
}
}
应该如何test
声明元组?
解决方案
为此,我会使用通用函数,请参见下面的示例:
//Model
struct Test: Decodable {
var name: String
var surname: String
var gender: String
}
//Generic function
func readJsonData<T: Decodable>(filename: String, completion: @escaping (T) -> ()) {
if let fileUrl = Bundle.main.url(forResource: filename, withExtension: "json") {
do {
let data = try Data(contentsOf: fileUrl)
let decoder = JSONDecoder()
let jsonData = try decoder.decode(T.self, from: data)
completion(jsonData)
} catch {
print("error: \(error)")
}
}
return
}
//How to call the generic function
readJsonData(filename: "Test") { (obj: Test) in
//do something with your returned object of type Test
}
推荐阅读
- dart - How to catch Errors thrown in onData Methods of stream.listen
- reactjs - 当打开一个新的 Popper 工具提示时,以前的元素仍然存在
- java - JTable重新排序时如何跟踪colem索引?
- flutter - 我想在按下按钮时创建小部件
- wpf - MVVM - 在 DataGrid 中显示单个对象数据
- api - 如何在 API 自动化空手道框架中将 PDF 文件作为表单数据上传?
- list - Liferay 列表中的 Freemarker?has_content 返回 TRUE,尽管列表不存在或为空
- reactjs - 将 saasquatch 与 React 集成
- ruby-on-rails - 使用对象属性动态建立 Rails 路径
- objective-c - Hiding cell in static table view