Swift:将通用的 FloatingPoint 值转换为 Int

标签 swift templates generics

考虑以下内容(从实际代码中简化而来):

func roundedInt<T: FloatingPoint>(_ f: T) -> Int {
    return Int(f.rounded())
}

编译失败,出现以下错误:

Cannot invoke initializer for type 'Int' with an argument list of type '(T)' Overloads for 'Int' exist with these partially matching parameter lists: (Int64), (Word), (UInt8), (Int8), (UInt16), (Int16), (UInt32), (Int32), (UInt64), (UInt), (Int), (Float), (Double), (Float80), (String, radix: Int), (CGFloat), (NSNumber)

我认为这意味着 FloatingPoint 无法与任何 Int 重载相匹配。

有没有一种简单的方法来完成这项工作?或者 Swift 泛型是否有限制(例如,与 C++ 模板相比)排除了这一点?

最佳答案

使用 BinaryFloatingPoint 这会如您所愿,在 Int 可以表示的范围内。

func roundedInt<T: BinaryFloatingPoint>(_ f: T) -> Int {
   return Int(f.rounded())
}

let x = roundedInt(Float(42.1)) // 42

关于Swift:将通用的 FloatingPoint 值转换为 Int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43706023/

相关文章:

c# - 获取部分开放泛型类型的类型表示

java - 类关系强类型化的最佳模式

xcode - 生成的 ModuleName-Swift.h 缺少方法

ios - 设置 View Controller 实例的 UIImageView

c++ - 如何编写类层次结构以在浮点类型之间轻松切换?

c++ - 为什么模板声明中的 size_t 参数需要是常量?

c++ - 在 C++ 中更改模板模板参数

java - Java 中使用泛型的生产者和消费者

php - 为 PHP 脚本的 POST 请求创建任务以在 MySQL 数据库中添加条目

javascript - 如何将 UIWebView 中的 JSContext 重新调整为 WKWebview 的 WKScriptMessage