2017-07-12 15 views
9

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 
+4

に制約ジェネリック型[プロトコルは、自分自身に準拠していない](https://stackoverflow.com/a/43408193/2976878)を使用します'Encodable'は' Encodable'に準拠する型ではないので、一般的なプレースホルダ 'Value'に対しては' Encodable'です。 vadianによれば、一般的なプレースホルダを使用するだけです。 – Hamish

答えて

25

あなたがで代用することはできませんので、Encodable

func saveObject<T : Encodable>(_ object: T, at location: String) { 
    //Some code 

    let data = try JSONEncoder().encode(object) 

    //Some more code 
} 
+0

もちろん、ありがとう、私はまだスウィフトに新しいです、そして、私はこれが完了した方法を完全に忘れました。 –

+1

何ですか?誰かが私にこの行動を説明できますか?それは私には意味をなさない –

関連する問題