2016-09-02 10 views
0

私は醜いものを構造体やシンプルなソリューションを使ってスマートに置き換えたいと思います。getterとsetterでクラスまたは構造体を使用して、関係で計算されたプロパティを持つようにしました

私のクラスには、構成することができるメソッドがたくさんありますが、私はそれが気に入らないのです。

私は想像力のために、いくつかのメソッドを持つクラスを作成しました。

の例では、メンバー間の関係についてですが、誰と、分散された予算)、カウント:

class Budget { 

    var distribution : (Int, Double) = (0, 0.0) // (number of members, sum per member) as tuple 

    func getBudget(distribution: (Int, Double)) -> Double { 
     let members = distribution.0 
     let perMember = distribution.1 
     return Double(members) * perMember 
    } 

    func ratioBySumPerMember(sum: Double) -> Double { 
     let budget = getBudget(distribution: distribution) 
     return sum/budget 
    } 

    func sumPerMemberByBudget(budget: Double) -> Double { 
     let members = distribution.0 
     return budget/Double(members) 
    } 

    func sumPerMemberByRatio(ratio: Double) -> Double { 
     let budget = getBudget(distribution: distribution) 
     return ratio * budget 
    } 

    func ratioByMembersCount(members: Int) -> Double{ 
     return Double(members)/100.0 
    } 

    func getBudgetBySumPerMember(sum: Double) -> Double { 
     distribution.1 = sum 
     let budget = getBudget(distribution: distribution) 
     return budget 
    } 

    /// ... etc 
} 

私はいくつかのスマートな計算式のように提供するために専用されている任意のプロパティ/構造体を、確立したいと思います。

結果を入力するだけでなく、入力値から結果を取得し、入力値を取得できる必要があります。誰にでもアイデアはありますか? 短ければ短いほど良い。可能であれば...

答えて

2

計算されたプロパティを使用するのがよい時です。

値を格納しないので、結果を計算するだけです。他のプロパティも設定します(直接ではありません)。では、間接的にプロパティを設定しましょう。変数を使用すると、共通の格納プロパティのように作業できます。

struct Distribution { 
    var members = 0, perMember = 0.0 
} 
struct Plan { 
    var distribution = Distribution() 
    var ratio: Double { 
     get { 
      return Double(distribution.perMember)/budget 
     } 
    } 
    var budget: Double { 
     get { 
      return Double(distribution.members) * distribution.perMember 
     } 
     set { 
      let perMember = newValue * ratio 
      distribution = Distribution(members: Int(newValue/perMember), perMember: perMember) 
     } 
    } 
} 

私は構造体を使用して変数を更新することによって、いくつかの出力を添付:

var plan = Plan(distribution: Distribution(members: 4, perMember: 1000.0)) 
print("\(plan.ratio * 100.0)% ") // 25.0% 
print(plan.budget) // 4000.0 
plan.distribution = Distribution(members: 5, perMember: 900.0) 
print("\(plan.ratio * 100.0)% ") // 20.0% 
print(plan.budget) // 4500.0 
plan.budget = 8000.0 
print(plan.distribution.perMember) // 1600.0 
関連する問題