swift - 尝试构建一个可以接受任何类型数字的乘法函数
问题描述
我想构建一个函数,它可以将 CGFloat、Double 或 Int 作为输入,并根据输入值类型返回乘法答案,如下代码:
更新:我注意到我的解释不够清晰,对不起,所以我在这里解释,我不希望我的返回类型被固定为 Double 或 Int 或 CGFloat,我的返回类型是动态的并且取决于 lhs 和 rhs!如果其中一个输入是 CGFloat 类型,那么返回类型肯定是 CGFloat,但是如果函数无法检测到任何 CGFloat 类型,那么它将尝试对 Double 进行相同的操作,并且至少对于 Int,此函数将返回 nil除 Int、Double 或 CGFloat 之外的任何其他类型。
我可能会在选择Numeric时出错我希望函数可以接受任何类型的数字,例如 Int、Double、CGFloat,而我选择 T 和 U 的原因是:lhs 可以是 Int,rhs 可以是 Double 或 CGFloat。或相反。
例如,函数的用户可以将 Int 加载到 lhs,将 CGFloat 加载到 rhs 并以 CGFloat 类型获得答案,或者:函数的用户可以例如将 Double 加载到 lhs,将 Int 加载到 rhs 并获得 Double 类型的答案.
func advancedMultiply<T: Numeric, U: Numeric> (lhs: T, rhs: U) -> Numeric? {
if (type(of: lhs) == CGFloat.self) || (type(of: rhs) == CGFloat.self) {
return CGFloat(lhs)*CGFloat(rhs)
}
else if (type(of: lhs) == Double.self) || (type(of: rhs) == Double.self) {
return Double(lhs)*Double(rhs)
}
else if (type(of: lhs) == Int.self) && (type(of: rhs) == Int.self) {
return lhs*rhs
}
else {
return nil
}
}
我尽力让它工作,但它有编译错误,我需要帮助才能找到正确的方法。
解决方案
首先,它是BinaryInteger
,不是Numeric
其次,T
遵守U
相同的协议并不意味着它们将是相同的类型。因此,您的返回值不正确。尝试不同的值,例如:Bool、String、Int、...
你可以在这里找到更多信息
推荐阅读
- ssl - 如何使用 HTTPS 库在 Node.js 中托管具有有效证书的 HTTPS 服务器
- python - 安装 django-tracking 时遇到问题
- flutter - 比较返回函数的值
- python - AWS:如何将一个简单的函数导入为 Lambda 层?
- nginx - 在 Nginx 上运行 fail2ban-regex 时了解 fail2ban 测试输出
- python - 我写的一行代码被标记为“未缩进不匹配任何外部缩进级别”,这是为什么呢?
- angular - 为什么Angular在使用服务时不更新变量或模态但是当我点击页面某处时它工作
- c# - 实例成员的静态成员错误,xUnit
- sql-server - 使用 sqlcmd 的 Sql 服务器身份验证失败
- javascript - Google Apps 脚本:创建多日事件 // 比较多行中的值