CodableKit
一个更Swift的 Codable 体验。 CodableKit 是一个库,用于扩展 Swift 的 Codable。
特性
- 不指定类型进行解码
- 解码/编码
Array<Any>
- 解码/编码
Dictionary<String, Any>
- 使用模型初始化器代替使用
Decoder.decode(...)
方法 - XML 自定义解码器/编码器 CodableKit/XMLParsing
要求
- iOS 9.0+
- Swift 5.1+
安装
CodableKit 通过依赖管理器 CocoaPods 可用。
要通过 Cocoapods 安装 CodableKit,只需在 podfile 中添加此内容,然后运行 pod install
pod 'Codable-Kit'
用法
在您需要进行编码/解码对象的Swift文件顶部导入CodableKit
import Codable_Kit
您与编码/解码的所有交互都将使用Swift的Codable
协议进行。这个库只是为提高Codable
的功能而添加的扩展集合。
通常解码一个对象需要您指定需要解码的对象类型。
let decoder = JSONDecoder()
do {
let user = try decoder.decode(User.self, from userData)
} catch {
print(error)
}
使用这个框架中添加的扩展,您现在可以在不指定方法本身上的数据类型的情况下进行解码。
let decoder = JSONDecoder()
do {
let user: User = try decoder.decode(userData)
// or
let user2 = try decoder.decode(userData) as User
} catch {
print(error)
}
此外,您还可以直接实例化遵循Decodable
的对象。
struct User: Decodable {
let id: String
let firstName: String
let lastName: String
}
do {
let user = try User(data)
let user2 = try User(string)
let user3 = try User(fileUrl)
} catch {
print(error)
}
这个框架添加的另一个功能是对[String: Any]
和[Any]
类型的解码/编码支持
let decoder = JSONDecoder()
do {
let dict = try decoder.decode([String: Any].self, from data)
let dict2: [String: Any] = try decoder.decode(data)
let dict3 = try decoder.decode(data) as [String: Any]
let array = try decoder.decode([Any].self, from data)
let array2: [Any] = try decoder.decode(data)
let array3 = try decoder.decode(data) as [Any]
} catch {
print(error)
}
这也会在遵循Codable
/Decodable
的模型上生效。
struct FooModel: Codable {
let dict: [String: Any]
let array: [Any]
let optionalDict: [String: Any]?
let optionalArray: [Any]?
enum CodingKeys: String, CodingKey {
case dict
case array
case optionalDict
case optionalArray
}
}
let decoder = JSONDecoder()
do {
let foo: FooModel = try decoder.decode(data)
print("dict:", foo.dict)
print("array:", foo.array)
print("optionalDict:", foo.optionalDict)
print("optionalArray:", foo.optionalArray)
} catch {
print(error)
}
此框架还可以从应用程序的包中解码文件
let decoder = FileDecoder(decoder: JSONDecoder(), bundle: .main, fileManager: .default)
do {
let user = try decoder.decode(User.self, from: File(name: "user", type: "json"))
let user2: User = try decoder.decode(File(name: "user", type: "json"))
} catch {
print(error)
}
许可证
所有源代码都根据MIT许可证授权。