Aslında yukarıdaki cevaplar gerçekten harika, ancak sürekli olarak geliştirilen bir istemci / sunucu projesinde birçok insanın neye ihtiyacı olduğuna dair bazı ayrıntılar eksik. Arka ucumuz zaman içinde sürekli olarak gelişirken bir uygulama geliştiriyoruz, bu da bazı numaralandırma vakalarının bu evrimi değiştireceği anlamına geliyor. Bu nedenle, bilinmeyen vakalar içeren numaralandırma dizilerinin kodunu çözebilen bir enum kod çözme stratejisine ihtiyacımız var. Aksi takdirde diziyi içeren nesnenin kodunun çözülmesi başarısız olur.
Yaptığım şey oldukça basit:
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
}
}
Bonus: Uygulamayı gizle> Koleksiyon haline getir
Uygulama detaylarını gizlemek her zaman iyi bir fikirdir. Bunun için biraz daha fazla koda ihtiyacınız olacak. Hüner uyması olduğu DirectionsList
için Collection
ve iç hale list
dizi özel:
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)
}
}
John Sundell'in bu blog gönderisinde özel koleksiyonlara uyma hakkında daha fazla bilgi edinebilirsiniz: https://medium.com/@johnsundell/creating-custom-collections-in-swift-a344e25d0bb0