swift - 通用数字参数

标签 swift numbers

是否可以使用泛型将任何整数值转换为 Double?我想让这个函数更方便一些,这样我就可以在此处插入任何数字,而不必转换我传递给 Doubles 的 hourminute 参数。主要是为了让我更了解泛型。

查看 Double 的 documentation我能找到的最接近的东西是 Double(exactly: T) 但它给了我一个可选值,而我找不到任何同时支持 +* 的协议(protocol)运算符并允许我转换为 Double。如果可能的话,我想在不创建自己的协议(protocol)的情况下执行此操作。

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

///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))

给出错误:无法推断通用参数“T”

最佳答案

Double(exactly:) 如果整数不能精确表示则失败 作为 64 位 IEEE-754 float ,即对于整数 greater or equal to 9,007,199,254,740,993在规模上, 在处理小时、分钟和 秒。 (实际上它根本不会失败,is a bug)。

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

Double(Int64(hour))

返回最接近的可表示 float 作为 非可选。

关于swift - 通用数字参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48067875/

相关文章:

swift - Swift 中的错误 "Trailing closure passed to parameter of type ' NSManagedObjectContext' 不接受闭包

ios - 如何删除Digit的登录 session ?

初始化之前使用的 Swift 变量

ios - 上下文类型 'Void' (又名 '()' )不能与数组文字一起使用

ios - 在 Swift 委托(delegate)中保留循环

javascript - JS - 素数脚本 - 解释

javascript - 在 JavaScript 提示中添加正数和负数

java - 尽管有正确的 boolean 值,代码也不会打印

javascript - 如何使用 javascript 将数字添加到 onclick url

java - 如何使用 Java 生成 1 到 6 之间的 6 个随机数?