1. yamazaki_sensei

    Posted

    yamazaki_sensei
Changes in title
+排他的なパラメータを表現するのにenumが便利だった話
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,44 @@
+# 初めに
+
+2つの引数を取る関数があって、引数のどちらか片方だけnilでないようにしたい、というとき ↓
+
+```swift
+func handleValue(a: Int?, b: Double?) {
+ assert((a == nil) != (b == nil))
+
+ // 実際の処理
+}
+```
+
+こんな感じでassertを使えば実現は出来るが、enumを使えばより綺麗に書けることを知った。
+そもそも関数を分けろ、などの設計の話はここでは無視する。
+
+# やったこと
+
+こんなenumを定義し、
+
+```swift
+enum Value {
+ case a(intValue: Int)
+ case b(doubleValue: Double)
+}
+```
+
+関数をこう変える
+
+```swift
+func handleValue(value: Value) {
+ switch value {
+ case let .a(intValue):
+ // aのときの処理
+ case let .b(doubleValue):
+ // bのときの処理
+ }
+}
+```
+
+これで、assertを付けなくてもやりたいことが実現できる上にinterfaceとして排他的なことが明示できるので何かと都合が良い。
+
+# 終わりに
+
+enumはいろいろと使い方が難しいが、慣れると便利だ。