वास्तव में ऊपर दिए गए उत्तर वास्तव में बहुत अच्छे हैं, लेकिन वे कुछ विवरणों को याद कर रहे हैं कि लगातार विकसित क्लाइंट / सर्वर प्रोजेक्ट में कितने लोगों की आवश्यकता है। हम एक ऐप विकसित करते हैं जबकि हमारा बैकेंड लगातार समय के साथ विकसित होता है, जिसका अर्थ है कि कुछ एनुम मामले उस विकास को बदल देंगे। इसलिए हमें एक एनुम डिकोडिंग रणनीति की आवश्यकता है जो अज्ञात मामलों में शामिल होने वाले एनम की सरणियों को डिकोड करने में सक्षम हो। अन्यथा उस ऑब्जेक्ट को डिकोड करना जिसमें सरणी होती है बस विफल हो जाती है।
मैंने जो किया वह काफी सरल है:
enum Direction: String, Decodable {
case north, south, east, west
}
struct DirectionList {
let directions: [Direction]
}
extension DirectionList: Decodable {
public init(from decoder: Decoder) throws {
var container = try decoder.unkeyedContainer()
var directions: [Direction] = []
while !container.isAtEnd {
// Here we just decode the string from the JSON which always works as long as the array element is a string
let rawValue = try container.decode(String.self)
guard let direction = Direction(rawValue: rawValue) else {
// Unknown enum value found - ignore, print error to console or log error to analytics service so you'll always know that there are apps out which cannot decode enum cases!
continue
}
// Add all known enum cases to the list of directions
directions.append(direction)
}
self.directions = directions
}
}
बोनस: कार्यान्वयन छिपाएँ> इसे एक संग्रह बनाएं
कार्यान्वयन विस्तार को छिपाने के लिए हमेशा एक अच्छा विचार है। इसके लिए आपको बस थोड़ा सा और कोड चाहिए होगा। चाल अनुरूप है DirectionsList
करने के लिए Collection
और अपने आंतरिक बनाने list
सरणी निजी:
struct DirectionList {
typealias ArrayType = [Direction]
private let directions: ArrayType
}
extension DirectionList: Collection {
typealias Index = ArrayType.Index
typealias Element = ArrayType.Element
// The upper and lower bounds of the collection, used in iterations
var startIndex: Index { return directions.startIndex }
var endIndex: Index { return directions.endIndex }
// Required subscript, based on a dictionary index
subscript(index: Index) -> Element {
get { return directions[index] }
}
// Method that returns the next index when iterating
func index(after i: Index) -> Index {
return directions.index(after: i)
}
}
आप जॉन सुंडेल द्वारा इस ब्लॉग पोस्ट में कस्टम संग्रह के अनुरूप के बारे में अधिक पढ़ सकते हैं: https://medium.com/@johnsundell/creating-custom-collections-in-swift-a344e25d0bb0