我会采用不同的方法来扩展Encodable协议,而不是使用可能需要的所有实例方法。在此基础上,您可以向方法添加参数以传递自定义编码器,并为所有方法提供默认编码器:
extension DataProtocol {
var string: String? { String(bytes: self, encoding: .utf8) }
}
extension Encodable {
func data(using encoder: JSONEncoder = JSONEncoder()) throws -> Data { try encoder.encode(self) }
func string(using encoder: JSONEncoder = JSONEncoder()) throws -> String { try data(using: encoder).string ?? "" }
}
使用方法
let message = ["key":["a","b","c"]]
let jsonData = try! message.data() // 21 bytes [123, 34, 107, 101, 121, 34, 58, 91, 34, 97, 34, 44, 34, 98, 34, 44, 34, 99, 34, 93, 125]
let jsonString = try! message.string() // "{"key":["a","b","c"]}"
使用默认编码器传递日期的示例。请注意,使用的dateEncodingStrategy是默认值(代表自2001年1月1日午夜以来经过的时间的Double类型):
let message = ["createdAt": Date()]
let jsonData = try! message.data() // 33 bytes -> [123, 34, 99, 114, 101, 97, 116, 101, 97, 100, 65, 116, 34, 58, 53, 55, 49, 54, 49, 55, 56, 52, 49, 46, 52, 53, 48, 55, 52, 52, 48, 51, 125]
let jsonString = try! message.string() // {"createdAt":571617841.45074403}"
现在您可以将自定义编码器传递给您的方法,以便以人类可读的格式格式化日期:
let message = ["createdAt": Date()]
let encoder = JSONEncoder()
encoder.dateEncodingStrategy = .iso8601
let jsonString = try! message.string(using: encoder) // "{"createdAt":"2019-02-11T22:48:19Z"}"
现在使用自定义消息结构。
struct Message: Codable {
let id: Int
let createdAt: Date
let sender, title, body: String
}
extension Encodable {
func sendDataToServer(using encoder: JSONEncoder = JSONEncoder()) throws {
print(self, terminator: "\n\n")
let data = try self.data(using: encoder)
print(data.string!)
print("Message was successfully sent")
}
}
let message = Message(id: 1, createdAt: Date(), sender: "user@company.com", title: "Lorem Ipsum", body: """
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
""")
let iso8601 = JSONEncoder()
iso8601.dateEncodingStrategy = .iso8601
iso8601.outputFormatting = .prettyPrinted
do {
try message.sendDataToServer(using: iso8601)
} catch {
print(error)
}
这将打印
Message(id: 1, createdAt: 2019-02-11 23:57:31 +0000, sender: "user@company.com", title: "Lorem Ipsum", body: "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry\'s standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.")
{
"body" : "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.",
"id" : 1,
"sender" : "user@company.com",
"title" : "Lorem Ipsum",
"createdAt" : "2019-02-11T23:57:31Z"
}
now just add the code to send the json data to the server
Encodable
替换为通用占位符Value
,因为Encodable
不是符合Encodable
的类型。请按照vadian所说使用通用占位符即可。 - Hamish