質問: (lhs: Optional2 , rhs: T)->Void{}
回答: ***`let v1 : Optional2 = 10 // ERROR` を解決する方法があるのでしょうか?*** ありません。 「`Optional`型の実態はこのようなenum型です」と言う解説をどこかで見つけられて、「それなら同じ構造を持つenum型を定義すれば、`Optional`型と同じ動作をさせることができるのか?」と言う疑問を持たれてお試しなのだと思いますが、結論は上記の通りです。 あなたが ***`ERROR`*** と示された例(が動いたとしたら)では`T`型が自動的に`Optional2`型に変換されているわけですが、このような動作は本物の`Optional`型に特有のもので、同内容のenum型を定義しても同じ動作は起こりません。Swift言語の開発スタッフはこのような状況をcompiler magicと呼んでいましたが、日本語の語感に合わせて言い換えると「`Optional`型はSwiftコンパイラーから特別扱いを受けている」と言った方が良さそうです。 Swift 4での文字列型のあり方について論じたこの文書の中では、 > > `Int` is a subtype of `Optional` > > > と表現している部分があるのですが、もちろんSwiftの言語上の機構としてはサブタイプと言う概念はなく、コンパイラー内部の問題か、もしくはコンパイラー製作者の概念の問題で、Swift言語を使うプログラマーがデータ型間にサブタイプの関係を定義できるわけではありません。コンパイラーが`Optional`型を特別扱いして、「サブタイプ」と呼びたくなるような動作を実現しているわけです。 他にも自前の`Optional`風データ型を`if-let`などのOptional-bindingで使えるようにする方法もありません。 **`Optional`型の基本的な構造はenumだが、その様々な振る舞いはコンパイラーの特別扱い(compiler magic)によって成り立っている** とご理解ください。 なお、Swiftでは代入演算子`=`はユーザ定義不可なので、代入演算子のオーバーロードによって解決することもできません。