Использование JSONEncoder для кодирования переменной с Кодируемым типом
мне удалось получить кодировку и декодирование JSON и plist, но только путем прямого вызова функции encode/decode для определенного объекта.
например:
struct Test: Codable {
var someString: String?
}
let testItem = Test()
testItem.someString = "abc"
let result = try JSONEncoder().encode(testItem)
это работает хорошо и без проблем.
однако я пытаюсь получить функцию, которая принимает только Codable
соответствие протоколу как тип и сохраняет этот объект.
func saveObject(_ object: Encodable, at location: String) {
// Some code
let data = try JSONEncoder().encode(object)
// Some more code
}
это приводит к следующей ошибке:
не может ссылаться на 'encode' со списком аргументов типа ' (Encodable)'
глядя на определение функции кодирования, кажется, что она должна быть в состоянии принять Encodable
, если Value
какой-то странный тип я не знаю.
open func encode<Value>(_ value: Value) throws -> Data where Value : Encodable
2 ответов
используйте универсальный тип, ограниченный Encodable
func saveObject<T : Encodable>(_ object: T, at location: String) {
//Some code
let data = try JSONEncoder().encode(object)
//Some more code
}
вам нужно использовать общую функцию с общим типом Encodable
нельзя
func toData(object: Encodable) throws -> Data {
let encoder = JSONEncoder()
return try encoder.encode(object) // Cannot invoke 'encode' with an argument list of type '(Encodable)'
}
вы можете
func toData<T: Encodable>(object: T) throws -> Data {
let encoder = JSONEncoder()
return try encoder.encode(object)
}