Rectangles で動作するプログラムがあるとしましょう (これは私の実際の問題の単純化された例です)。これを次のようにモデル化します。
struct Rectangle {
let left:Int
let right:Int
let top:Int
let bottom:Int
func rationalized() -> Rectangle {
return Rectangle(left: min(self.left, self, right), right: max(self.left, self.right), top: min(self.top, self.bottom)
}
}
有理化された長方形は、基本的に正の幅と高さを持つ長方形です。多くの操作 (拡大縮小、平行移動、結合、交差など) では、四角形が合理化されていることを保証すると便利です。init(...)
実際、不合理なロジックを作成できないように、合理化ロジックを にインターンすることもできます。しかし、少なくとも一時的に、おそらくドラッグ アンド ドロップ中の編集のために、不合理な構造をサポートしたい場合があります。
func replacing(left newValue:Int) -> Rectangle {
return Rectangle(left: newValue, right: self.right, top: self.top, bottom: self.bottom)
}
これを行うと、合理化ロジックを init() に入れると裏目に出てしまいます。
しかし、別の方法として、(ドラッグ アンド ドロップ サイトを除く) ほぼすべての場所にコードを散らかしてrationalized()
呼び出しを行うことです。何とか構造体と型でこれを行うことができるかどうかを判断しようとしています。
クラスを使用していた場合、Rectangle スーパークラスと RationalizedRectangle サブクラスを持つことができ、RationalizedRectangle が init をオーバーライドして作業を行います。次に、通常は RationalizedRectangles を使用して (必要に応じて型として指定することもできます)、Rectangle を使用してそれらを編集し、最後に RationalizedRectangle に変換することができます。
しかし、Swift 構造体は継承をサポートしていません。だから私は慣用的にこれを達成する方法に途方に暮れています。構造体に isRationalizing:Boolean を追加して分岐することもできますが、それは安っぽく見えます。
ここで機能する構造体ベースのイディオムはありますか?