Отображение строки на основе 3 значений int - PullRequest
0 голосов
/ 16 сентября 2018

Я пытаюсь отобразить строку в этом формате

x day, y hr, z min

, где x, y, z - значения Int от пользователя, и пользователь должен отправить не менее 5 минут, если день и час0.

Это моя функция, в которой я обрабатываю отображение пользовательского ввода

    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 (день: 0, час: 2, минуты: 0), моя строка будетshow

2 hr, 0 min

, что не является идеей, поскольку предполагает просто показать

2 hr

Кроме того, если пользователь отправляет pickerTimeShow (день: 5, час: 0, минут: 5),моя строка покажет

5 day, 0 hr, 5 min

но я просто хочу

5 day, 5 min

У вас есть простое решение для этого случая?Я действительно не могу думать ни о чем другом, кроме добавления еще оператора if для проверки, что делает мою функцию очень длинной.Большое вам спасибо.

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

В качестве альтернативы - если вы можете жить с 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)
}

Функция возвращает nil, если вход out-of заказ .

0 голосов
/ 16 сентября 2018

Вот один из способов сделать это. Поместите части в массив, а затем соедините их в конце:

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"
...