Существует несколько подходов к решению этой проблемы.
@ SPatel решение расширения Encodable
является одной из возможностей. Однако я лично стараюсь не загрязнять предоставляемые Apple протоколы расширениями.
Если я читаю между строк, кажется, что вы хотите передать любую конструкцию , соответствующую Encodable
, функции / методу в некоторые другие структура / класс.
Давайте рассмотрим пример того, что я думаю вы пытаетесь достичь:
struct Transform {
static func toJson(encodable: Encodable) throws -> Data {
return try JSONEncoder().encode(encodable)
}
}
Однако Xcode будет жаловаться:
Protocol type 'Encodable' cannot conform to 'Encodable' because only concrete types can conform to protocols
Решение Swift-ier состоит в том, чтобы использовать ограниченный универсальный для функции:
struct Transform {
static func toJson<EncodableType: Encodable>(encodable: EncodableType) throws -> Data {
return try JSONEncoder().encode(encodable)
}
}
Теперь компилятор может вывести тип, соответствующий Encodable
, и мы можем вызвать функцию по назначению:
let dataSource = TestClass2()
let jsonData = try? Transform.toJson(encodable: dataSource)