通用数字参数

时间:2018-01-02 21:09:36

标签: swift numbers

是否可以使用泛型将任何整数值转换为Double?我想让这个函数更方便,所以我可以在这里插入任何数字,而不必将我传入的hourminute参数转换为双打。主要是为了让我更了解仿制药。

查看Double documentation我能找到的最接近的东西是Double(确切地说:T)但是它给了我一个可选值,而我找不到任何支持+的协议和*运算符,并允许我转换为Double。如果可能的话,我不想创建自己的协议。

这不起作用,但说明了我正在尝试做的事情:

///Returns a Date object for today set to a given time on a 24 hour clock
private func today<T: SignedInteger>(hour: T = 0, minute: T = 0, second: T = 0) -> Date {
    let secondsPastMidnight: Double = Double(exactly: hour)! * 60 * 60 + Double(exactly: minute)! * 60 + Double(exactly: second)!
    return Date().startOfDay.addingTimeInterval(secondsPastMidnight)
}

如上所述调用上述内容:

let superEarlyMeeting = Meeting(UUID: "0", startTime: today(), endTime: today(hour: SharedGlobals.Calendar.WORK_HOURS_START))

给出错误:Generic parameter 'T' could not be inferred

1 个答案:

答案 0 :(得分:1)

如果整数不能完全表示,则

Double(exactly:)会失败 作为64位IEEE-754浮点数,即大小为greater or equal to 9,007,199,254,740,993的整数, 在使用小时,分钟和时,这应该不是问题 秒。 (实际上它根本没有失败,is a bug)。

或者,您可以通过最大的有符号整数类型进行转换,例如

Double(Int64(hour))

返回最接近的可表示浮点数作为a 非可选的。