基于 3 个 int 值显示字符串

Displaying String based on 3 int values

我正在尝试以这种格式显示字符串

x day, y hr, z min

其中 x、y、z 是来自用户的 Int 值,如果 day 和 hr 为 0,则用户需要至少在 5 分钟内发送。

这是我处理显示用户输入的函数

    func pickerTimeShow(day: Int, hour: Int, minutes: Int) -> String {
    if day > 0 {
        return "\(day) day, \(hour) hr, \(minutes) min"
    }
    if hour > 0 {
        return "\(hour) hr, \(minutes) min"
    }
    return "\(minutes) min"
}

但是,如果用户发送 pickerTimeShow(day: 0, hour: 2, minutes: 0),我的字符串将显示

2 hr, 0 min

这不是主意,因为它应该只显示

2 hr

此外,如果用户发送 pickerTimeShow(day: 5, hour: 0, minutes: 5),我的字符串将显示

5 day, 0 hr, 5 min

但我只想

5 day, 5 min

您有处理这种情况的简单解决方案吗?除了添加更多 if 语句来检查是什么让我的函数变得很长之外,我真的想不出还有什么。非常感谢。

这是一种方法。将碎片放入一个数组中,然后在最后加入它们:

func pickerTimeShow(day: Int, hour: Int, minutes: Int) -> String {
    var result = [String]()

    if day > 0 {
        result.append("\(day) day")
    }

    if hour > 0 {
        result.append("\(hour) hr")
    }

    if minutes > 0 {
        result.append("\(minutes) min")
    }

    if result.isEmpty {
        // decide what to return in the case that all are zero
        return "0 min"
    } else {
        return result.joined(separator: ", ")
    }
}

测试:

pickerTimeShow(day: 0, hour: 0, minutes: 0)  // "0 min"
pickerTimeShow(day: 5, hour: 0, minutes: 0)  // "5 day"
pickerTimeShow(day: 0, hour: 6, minutes: 0)  // "6 hr"
pickerTimeShow(day: 0, hour: 0, minutes: 7)  // "7 min"
pickerTimeShow(day: 5, hour: 6, minutes: 0)  // "5 day, 6 hr"
pickerTimeShow(day: 0, hour: 6, minutes: 7)  // "6 hr, 7 min"
pickerTimeShow(day: 5, hour: 0, minutes: 7)  // "5 day, 7 min"
pickerTimeShow(day: 5, hour: 6, minutes: 7)  // "5 day, 6 hr, 7 min"

或者 – 如果您可以接受 5 days 而不是 5 day – 这是使用 DateComponentsFormatter

的解决方案
func pickerTimeShow(day: Int, hour: Int, minutes: Int) -> String? {
    let dateComponents = DateComponents(day: day, hour: hour, minute: minutes)
    let formatter = DateComponentsFormatter()
    formatter.unitsStyle = .short
    formatter.allowedUnits = [.day, .hour, .minute]
    return formatter.string(from: dateComponents)
}

函数returns nil 如果输入乱序