Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 更实用/快捷的时间转换方式_Swift_Functional Programming - Fatal编程技术网

Swift 更实用/快捷的时间转换方式

Swift 更实用/快捷的时间转换方式,swift,functional-programming,Swift,Functional Programming,我试图将时间长度转换为小时:分钟到分钟。时间是以字符串形式给出的,我想返回两倍的分钟数 目前我正在使用以下功能: func convertMinHoursToDouble(length: String) -> Double { var hours = 0.0 var minutes = 0.0 let lengthCleaned = length.stringByReplacingOccurrencesOfString(":", withString: "") var count =

我试图将时间长度转换为小时:分钟到分钟。时间是以字符串形式给出的,我想返回两倍的分钟数

目前我正在使用以下功能:

func convertMinHoursToDouble(length: String) -> Double {
var hours = 0.0
var minutes = 0.0

let lengthCleaned = length.stringByReplacingOccurrencesOfString(":", withString: "")

var count = 0
for char in lengthCleaned.characters {
  if count == 0 {
    hours = Double("\(char)")! * 60
  } else if count == 1 {
    minutes = Double("\(char)")! * 10
  } else if count == 2 {
    minutes = Double("\(char)")! + minutes
  }
  ++count
 }
return hours+minutes
}

let time = "2:16"
let convertedTime = convertMinHoursToDouble(time)
print(convertedTime) // prints 136.0
这是可行的,但是我正试图以一种更实用/快捷的方式来实现这一点。如何使用reduce函数完成此操作。这是我能找到的最接近解决方案

let convertedTime = time.characters.reduce(0) { (dub, char) in dub + Double(String(char))!  }
功能解决方案:

func convertMinHoursToDouble(time: String) -> Int {
    let timeComps = (time as NSString).componentsSeparatedByString(":") as [NSString]
    return timeComps.reduce(0) { acc, item in
        acc * 60 + item.integerValue
    }
}

let time = "02:15"
let convertedTime = convertMinHoursToDouble(time)
print(convertedTime)
将字符串拆分为多个组件,并在该数组上进行缩减。对于03:24:34这样的字符串,它也可以像符咒一样计算时间(以秒为单位)

如果要处理格式错误的字符串:否:、多个:、无效分钟值(如78等),可以添加其他验证逻辑。

功能解决方案:

func convertMinHoursToDouble(time: String) -> Int {
    let timeComps = (time as NSString).componentsSeparatedByString(":") as [NSString]
    return timeComps.reduce(0) { acc, item in
        acc * 60 + item.integerValue
    }
}

let time = "02:15"
let convertedTime = convertMinHoursToDouble(time)
print(convertedTime)
将字符串拆分为多个组件,并在该数组上进行缩减。对于03:24:34这样的字符串,它也可以像符咒一样计算时间(以秒为单位)


如果要处理格式错误的字符串:否:、多个:、无效分钟值(如78等),则可以添加其他验证逻辑。

纯Swift方法是:

let time = "02:16"

let converted = time.characters.split(":")
    .flatMap { Int(String($0)) }
    .reduce(0) {  $0 * 60 + $1 }

print(converted) //"136\n"

纯粹的快捷方式是:

let time = "02:16"

let converted = time.characters.split(":")
    .flatMap { Int(String($0)) }
    .reduce(0) {  $0 * 60 + $1 }

print(converted) //"136\n"

如果您正在寻找如何改进这段代码,这个问题可能更适合。如果您正在寻找如何改进这段代码,这个问题可能更适合。这有一个双重转换,可以简化为一行:time.componentsSeparatedByString:as[NSString]。reduce0{a,v in 60*a+v.integerValue}。这很漂亮。感谢您的快速回答Cristik&CR Drost这有一个双重类型,可以简化为一行:time.componentsSeparatedByString:as[NSString]。简化0{a,v in 60*a+v.integerValue}。这很漂亮。谢谢你的快速回答Cristik&CR DrostYeap,比我快:是的,比我快: