Advertisement
Guest User

Untitled

a guest
Feb 27th, 2017
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.13 KB | None | 0 0
  1. // 動作検証してないですけど、列挙型を使う方法を描いてみますね。
  2. // 構造体でオプショナルを使う方法も、型の名前通り『どちらか1方』を保証できること、
  3. // また『数値でも文字列でもなかった時(想定外)は両方 nil』みたいな状況にならないため、想定外を判断しやすくなる(判断を強いられる)ようになるのを期待してます。
  4. enum IntOrString: Decodable {
  5.  
  6. // Int? と String? を持たせる方法よりも『択一性』が表現できます。
  7. case int(Int)
  8. case string(String)
  9.  
  10. // デコードでは switch を使って『目標が e.rawValue』であることを明確にしたり、
  11. // 漏れがあった時に Himotoki.DecodeError.typeMismatch を返して、さらに『文字と数値以外』が得られた時に、それをエラー機構にゆだねることができるはずです。
  12. static func decode(_ e: Extractor) throws -> IntOrString {
  13.  
  14. switch e.rawValue {
  15.  
  16. case let v as String:
  17. return .string(v)
  18.  
  19. case let v as Int:
  20. return .int(v)
  21.  
  22. case let v:
  23. throw typeMismatch("Int or String", actual: v)
  24. }
  25. }
  26. }
  27.  
  28. extension IntOrString : CustomStringConvertible {
  29.  
  30. // 必要なら(というか Swift の世界では文字列表現にしたいなら)そのものを単一の文字列表現可能にする (CustomStringConvertible) 手もあります。
  31. // そうすると、内部で int か string かを意識せずに、value.description で、文字列として扱えるようになります。
  32. // 今回みたいな IntOrString みたいな汎用的な名前の方の場合は、今回みたいに CustomStringConvertible に頼るよりも単純に var stringValue を実装して value.stringValue とする方が明瞭な可能性もあります。
  33. var description: String {
  34.  
  35. switch self {
  36.  
  37. case let .int(v as CustomStringConvertible), let .string(v as CustomStringConvertible):
  38. return v.description
  39. }
  40. }
  41. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement