2017-07-12 11 views
9

के रूप में मैं जेएसओएन और पी-सूची एन्कोडिंग और डिकोडिंग दोनों काम करने में कामयाब रहा, लेकिन केवल एक विशिष्ट ऑब्जेक्ट पर एन्कोड/डिकोड फ़ंक्शन को सीधे कॉल करके।कोडन के साथ एक चर को एन्कोड करने के लिए JSON एन्कोडर का उपयोग

उदाहरण के लिए:

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)'

एनकोड समारोह की परिभाषा को देखते हुए, ऐसा लगता है जैसे कि यह Encodable, स्वीकार करने के लिए सक्षम होना चाहिए, जब तक कि मूल्य कुछ अजीब प्रकार मैं डॉन है के बारे में पता नहीं है

open func encode<Value>(_ value: Value) throws -> Data where Value : Encodable 
+4

करने के लिए विवश का प्रयोग करें [प्रोटोकॉल खुद को के अनुरूप नहीं है] (https://stackoverflow.com/a/43408193/2976878) है, तो आप में स्थानापन्न नहीं कर सकता जेनेरिक प्लेसहोल्डर 'वैल्यू' के लिए 'एनकोडेबल', 'एनकोडेबल' एक प्रकार नहीं है जो 'एनकोडेबल' के अनुरूप है। वैदियन कहते हैं, बस एक जेनेरिक प्लेसहोल्डर का उपयोग करें। – 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

क्या? क्या कोई मुझे इस व्यवहार की व्याख्या कर सकता है? यह मुझे कोई समझ नहीं आता है –

संबंधित मुद्दे

 संबंधित मुद्दे