То, как вы это решите, сильно зависит от решаемой проблемы.
Если вы хотите сохранить и загрузить именно эти два ключа в JSON, тогда Application должно быть структурой (как отмечает jawadAli).
Если вы хотите сохранить больше информации, но данный Компонент привязан ровно к одному типу Приложения, тогда вы хотите, чтобы Компонент был общим c:
public struct Component<App: Application & Codable> : Codable {
let application : App
...
}
Обратите внимание на добавление & Codable
. Если все, что соответствует Application, должно быть кодируемым, вы можете сделать это требованием Application
:
public protocol Application: Codable {
var name : String {get}
var ownerName : String {get}
}
. Важно понимать, что это не делает приложение совместимым с Codable. Это означает, что для соответствия Application тип также должен соответствовать Codable. Невозможно декодировать абстрактный тип (например, протокол).
Если вы хотите сохранить больше информации, но данный Компонент на самом деле не знает, какое приложение он содержит, тогда это больше сложная проблема (и часто чрезмерно сложная, и ее следует переосмыслить; если вы обнаружите, что используете много as?
тестов, вам почти наверняка следует изменить дизайн). Если это ваша проблема, вам следует подробнее объяснить, какую проблему вы решаете, и мы обсудим, как ее решить. (Обычно для этого требуется какая-то система регистрации типов Dynami c и формат JSON, который поддерживает метаданные о типах. Или вы можете переключиться на NSCoder и не использовать JSON.)