Инициализируйте оболочку свойства с динамическими значениями в Swift 5 - PullRequest
0 голосов
/ 31 октября 2019

Сценарий:

  1. Я хочу иметь различные типы Облигаций, которые имеют минимальное значение, текущую стоимость облигации с гибким процентом (рассчитанную на основе некоторой логики)и прогноз роста облигаций.

  2. Всякий раз, когда стоимость облигации выходит за рамки минимального значения, прогноз роста становится более благоприятным и наоборот, наоборот.

  3. Я могу иметьнесколько связей с собственным набором значений.

Я пытаюсь использовать оболочки свойств для одного и того же, чтобы я не повторял одинаковое поведение для каждой связи:

 @propertyWrapper
struct BondValue {
    private var bondCurrentWorth: Int
    private var minimumValue: Int
    private var flexiInterest: Int

    var projectedValue: BondGrowth = .appreciating // The projected value projects the growth for the bond

    var wrappedValue: Int {

        get {
            return bondCurrentWorth
        }

        set {
            bondCurrentWorth = newValue + (newValue * flexiInterest/100)
            projectedValue = bondCurrentWorth < minimumValue ? .depriciating : .appreciating
        } 
 }

    init(wrappedValue: Int = 0, minimumValue: Int, flexiInterest: Int, value: Int) {
        self.minimumValue = minimumValue
        self.flexiInterest = flexiInterest
        self.bondCurrentWorth = value
    }
}

Нет для создания какой-либо связи, я делаю:

struct FoodBond {
    var bondName: String
    @BondValue(minimumValue: 200, flexiInterest: 30, value: 200) var value = 30

    init(bondName: String, minimumValue: Int, flexiInterest: Int, value: Int) {
        self.bondName = bondName
    }
}

Постановка задачи: - Я не могу инициализировать значение облигации динамическими значениями.

ВозможноОбход проблемы: Я бы использовал тот же подход, что и обычная структура в приведенной ниже реализации. Хотя этот способ использования оболочки свойств также указан в документах, , но я бы потерял синтаксический вкус оболочек свойств.

Вы можете написатькод, который использует поведение оболочки свойств без использования синтаксиса специальных атрибутов. Например, вот версия SmallRectangle из предыдущего листинга кода, которая явно оборачивает свои свойства в структуру TwelveOrLess вместо записи @TwelveOrLess в качестве атрибута

@propertyWrapper
struct BondValue {
    private (set) var bondCurrentWorth: Int
    private (set) var minimumValue: Int
    private (set) var flexiInterest: Int

    var projectedValue: BondGrowth = .appreciating // The projected value projects the growth for the bond

    var wrappedValue: Int { .... }

    init(wrappedValue: Int = 0, minimumValue: Int, flexiInterest: Int, value: Int) { ... }
}

struct FoodBond {
    var bondName: String
    var value = BondValue(minimumValue: 0, flexiInterest: 0, value: 0) // Provide a default value

    init(bondName: String, minimumValue: Int, flexiInterest: Int, value: Int) {
        self.bondName = bondName
        self.value = BondValue(minimumValue: minimumValue, flexiInterest: flexiInterest, value: value)
    }
}

var foodBond = FoodBond(bondName: "Food Bond", minimumValue: 200, flexiInterest: 10, value: 200)
print("Initial bond current worth - \(foodBond.value.bondCurrentWorth)")
print("Bond growth - \(foodBond.value.projectedValue)")

Любые предложения будут действительно полезны.

1 Ответ

0 голосов
/ 01 ноября 2019

Ссылаясь на раздел Memberwise Initialisers из документа предложения Swift для оболочек свойств:

Свойства экземпляра, которые имеют оболочку свойств, будут иметь соответствующий параметр в инициализаторе по элементам, чейТип будет либо исходным типом свойства, либо типом оболочки, в зависимости от типа оболочки и начального значения (если оно предусмотрено).

Решение:

struct FoodBond {
    var bondName: String

    @BondValue(minimumValue: 0, flexiInterest: 0, value: 0) var bondValue = 0

    init(bondName: String, minimumValue: Int, flexiInterest: Int, value: Int) {
        self.bondName = bondName
        _bondValue = BondValue(minimumValue: minimumValue, flexiInterest: flexiInterest, value: value)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...