diff --git a/swift/Sources/GildedRose/GildedRose.swift b/swift/Sources/GildedRose/GildedRose.swift index 4f4e22ba..5175135e 100644 --- a/swift/Sources/GildedRose/GildedRose.swift +++ b/swift/Sources/GildedRose/GildedRose.swift @@ -4,8 +4,8 @@ public class GildedRose { private static let agedBrieString = "Aged Brie" private static let backstagePassString = "Backstage passes to a TAFKAL80ETC concert" private static let sulfurasString = "Sulfuras, Hand of Ragnaros" + private static let conjuredString = "conjured" - private static let itemQualityDegradationAmount = -1 private static let minimumQuality = 0 private static let maximumQuality = 50 @@ -15,49 +15,46 @@ public class GildedRose { self.items = items } + private func calculateDegradeRate(_ item: Item, isExpired: Bool) -> Int { + let degradeRate = item.name.lowercased().range(of: GildedRose.conjuredString) != nil ? -2 : -1 + return isExpired ? degradeRate * 2 : degradeRate + } + private func adjustQuality(_ item: Item, adjustment: Int) { let adjustedQuality = item.quality + adjustment if adjustedQuality <= GildedRose.maximumQuality && adjustedQuality >= GildedRose.minimumQuality { item.quality += adjustment } } + + private func adjustBackstagePassQuality(_ item: Item, isExpired: Bool) { + self.adjustQuality(item, adjustment: 1) + if item.sellIn < 11 { + self.adjustQuality(item, adjustment: 1) + } + if item.sellIn < 6 { + self.adjustQuality(item, adjustment: 1) + } + if isExpired { + self.adjustQuality(item, adjustment: -item.quality) + } + } private func updateItemQuality(_ item: Item) { - let itemQualityDegradationAmount = item.name.lowercased().range(of: "conjured") != nil ? GildedRose.itemQualityDegradationAmount * 2 : GildedRose.itemQualityDegradationAmount - - if item.name != GildedRose.agedBrieString, item.name != GildedRose.backstagePassString { - if item.name != GildedRose.sulfurasString { - self.adjustQuality(item, adjustment: itemQualityDegradationAmount) - } - } else { - self.adjustQuality(item, adjustment: 1) - - if item.name == GildedRose.backstagePassString { - if item.sellIn < 11 { - self.adjustQuality(item, adjustment: 1) - } - - if item.sellIn < 6 { - self.adjustQuality(item, adjustment: 1) - } - } + let isExpired = item.sellIn < 1 + let itemQualityDegradationAmount = self.calculateDegradeRate(item, isExpired: isExpired) + if item.name != GildedRose.agedBrieString && item.name != GildedRose.backstagePassString && item.name != GildedRose.sulfurasString { + self.adjustQuality(item, adjustment: itemQualityDegradationAmount) + } + if item.name == GildedRose.agedBrieString { + self.adjustQuality(item, adjustment: isExpired ? 2 : 1) + } + if item.name == GildedRose.backstagePassString { + self.adjustBackstagePassQuality(item, isExpired: isExpired) } if item.name != GildedRose.sulfurasString { item.sellIn = item.sellIn - 1 } - if item.sellIn < 0 { - if item.name != GildedRose.agedBrieString { - if item.name != GildedRose.backstagePassString { - if item.name != GildedRose.sulfurasString { - self.adjustQuality(item, adjustment: itemQualityDegradationAmount) - } - } else { - self.adjustQuality(item, adjustment: -item.quality) - } - } else { - self.adjustQuality(item, adjustment: 1) - } - } } public func updateQuality() {