Использование 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)
}