/ / Використовуючи клас або struct з getter і setter, щоб мати обчислення властивостей з відносинами - swift, class, struct

Використовуйте клас або struct з getter і setter, щоб мати обчислення властивостей з відносинами - 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
}

Я хотів би створити будь-яку властивість / структуру, яка призначена для того, щоб служити як розумна розрахункова формула.

Вона повинна вміти отримувати результат від вхідних значень, а також отримувати вхідні значення, вклавши в нього результат. Чи буде у когось ідея? Чим коротше, тим краще. Якщо можливо...

Відповіді:

2 для відповіді № 1

Це приємний приклад ситуації, коли це хороший час для використання обчислювальні властивості.

Він не зберігає значення, це просто обчисленнярезультат Він встановлює інші властивості (не безпосередньо). Таким чином, нехай буде побічно встановити властивості. З змінних ви можете працювати, як вони були загальними збереженими властивостями.

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