我正在尝试以这种格式显示字符串
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(天:0,时:2,分钟:0),我的字符串将显示
2 hr, 0 min
这不是个主意,因为它只是显示
2 hr
此外,如果用户发送pickerTimeShow(天:5,小时:0,分钟:5),我的字符串将显示
5 day, 0 hr, 5 min
但我只想
5 day, 5 min
您有一个简单的解决方案来处理这种情况吗?除了添加更多的if语句进行检查之外,我真的什么也没想到,这使我的功能真的很长。非常感谢。
答案 0 :(得分:5)
这是一种方法。将这些片段放入一个数组中,然后在最后加入它们:
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"
答案 1 :(得分:4)
或者-如果您可以使用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
。