JSONとPリストの両方のエンコーディングとデコードを行うことができましたが、特定のオブジェクトに対してエンコード/デコード機能を直接呼び出すだけでした。例えばJSONエンコーダを使用してCodableの変数を型として符号化
:
struct Test: Codable {
var someString: String?
}
let testItem = Test()
testItem.someString = "abc"
let result = try JSONEncoder().encode(testItem)
これはうまくと問題なく動作します。
しかし、私はタイプとしてコード可能なプロトコルの適合性しか取らず、そのオブジェクトを保存する関数を取得しようとしています。
これは、次のエラーが発生しfunc saveObject(_ object: Encodable, at location: String) {
//Some code
let data = try JSONEncoder().encode(object)
//Some more code
}
:
Cannot invoke 'encode' with an argument list of type '(Encodable)'
エンコード機能の定義を見てみると、価値がいくつかの奇妙なタイプがIドンでない限り、エンコード可能なを、受け入れることができなければならないかのように思えます知っている。
open func encode<Value>(_ value: Value) throws -> Data where Value : Encodable
に制約ジェネリック型[プロトコルは、自分自身に準拠していない](https://stackoverflow.com/a/43408193/2976878)を使用します'Encodable'は' Encodable'に準拠する型ではないので、一般的なプレースホルダ 'Value'に対しては' Encodable'です。 vadianによれば、一般的なプレースホルダを使用するだけです。 – Hamish