使用带有getter和setter的类或结构来获得使用关系计算的属性

时间:2016-09-02 19:07:11

标签: swift class struct

我想用更聪明的东西,使用结构或任何简单的解决方案来取代我的丑陋。

我班上有很多方法可以编写,我不喜欢它。

对于想象力,我创建了一个包含一些方法的类。

一个例子是关于成员数量,谁和分配的预算之间的关系:

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
}

我想建立任何属性/结构,专门用作一些智能计算公式。

它应该能够通过将结果放入其中来获得输入值的结果,以及获取输入值。有人有想法吗? 越短越好。如果可能......

1 个答案:

答案 0 :(得分: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