2016-12-04 8 views
1

私は 'RotaryWheel'という名前のカスタムUIControlサブクラスを作成しました。ジェスチャーに反応する選択ホイールです。オブジェクトの委任によって '値渡し'を強制する

ホイールの各選択は、以下のように表されます。

struct RotaryWheelSectorExternal { 

    let section: Int 
    let title: String 
    var item: Any? 

    init(section: Int, title: String, item: Any? = nil) { 
     self.section = section 
     self.title = title 
     self.item = item 
    } 
} 

上記は公開APIであり、消費されると内部的に表現されます。上記の構造体の両方が同じ情報が含まれているか

struct RotaryWheelSectorInternal { 

    let sector: Int 
    let minValue: Double 
    let midValue: Double 
    let maxValue: Double 
    let angle: Double 
    let title: String 
    var item: Any? 

} 

通知は、しかし、一方が他方よりも冗長です。

ロータリーホイールデリゲートは、外部表示のみを報告することにより、このデザインに忠実です。もちろん

protocol RotaryWheelControlDelegate: class { 
    func rotationEnded(onSector sector: RotaryWheelSectorExternal) 
} 

ホイールがインスタンス化し、内部されている場合、これは、外部>内部の変換が必要>外部ユーザーは、そのデリゲートに選択し、車輪制御レポートの選択になりますよう。

これは私にはうってつけのものではありませんが、私は次のことも正しく感じられないほど長くスウィフトを書いています。

class RotaryWheelSector { 

    let sector: Int 
    var minValue: Double? 
    var midValue: Double? 
    var maxValue: Double? 
    var angle: Double? 
    let title: String 
    var item: Any? 

    init... 

} 

これは私が考えた別のオプションです。

class RotaryWheelSectorExternal { 

    let section: Int 
    let title: String 
    var item: Any? 

    init(section: Int, title: String, item: Any? = nil) { 
     self.section = section 
     self.title = title 
     self.item = item 
    } 
} 

class RotaryWheelSectorInternal: RotaryWheelSectorExternal { 

    let minValue: Double 
    let midValue: Double 
    let maxValue: Double 
    let angle: Double 

    init(section: Int, title: String, item: Any?, min: Double, mid: Double, max: Double, angle: Double) { 
     self.minValue = min 
     self.midValue = mid 
     self.maxValue = max 
     self.angle = angle 
     super.init(section: section, title: title, item: item) 
    } 

    convenience init(sector: RotaryWheelSectorExternal, min: Double, mid: Double, max: Double, angle: Double) { 
     self.init(section: sector.section, title: sector.title, item: sector.item, min: min, mid: mid, max: max, angle: angle) 
    } 

} 

しかし、これはどちらかといえば気に入らず、どちらのアプローチをとるべきかわかりません。

これについてのご意見はありがとうございます。

+0

私はここで何か不足しているかもしれませんが、ただひとつの構造体を使って、公開APIに公開したくないプロパティを '(ファイル)private'や' internal'としてマークしてみませんか? – Hamish

+0

@Hamishクラスがインスタンス化されたら、min、mid、maxの値は変更しないでください。クラスが公開APIレベルでインスタンス化されている場合は、min、mid、およびmaxもそこに設定する必要があります。しかし、公的レベルは、それらの値が利用可能な場所ではありません。 –

答えて

0

私は、外部表現のプロトコルを作成し、そのプロトコルのインスタンスを代理人に処理させ、内部表現構造体を外部表現プロトコルに適合させることをお勧めします。これにより、内部プロパティをデリゲートに公開しないで、どこでも同じ構造体インスタンスを使用できます(変換は必要ありません)。

例:この例では

fileprivate struct RotaryWheelSectorInternal { 

    let sector: Int 
    let minValue: Double 
    let midValue: Double 
    let maxValue: Double 
    let angle: Double 
    let title: String 
    var item: Any? 

} 

protocol RotaryWheelSectorData { 

    let section: Int 
    let title: String 
    var item: Any? 

} 

protocol RotaryWheelControlDelegate: class { 
    func rotationEnded(onSector sector: RotaryWheelSectorData) 
} 

extension RotaryWheelSectionInternal : RotaryWheelSectorData { } 

、実際RotaryWheelSectoryInternalタイプであっても、他のクラスが、RotaryWheelSectorDataプロトコル意志に表示されません。だからRotaryWheelSectoryInternalのインスタンスをRotaryWheelSectorDataのインスタンスとして外部デリゲートに渡すことができ、したがってその構造体のプロパティだけを公開することができます。