首页 > 解决方案 > 尝试构建一个可以接受任何类型数字的乘法函数

问题描述

我想构建一个函数,它可以将 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
        
    }

}

我尽力让它工作,但它有编译错误,我需要帮助才能找到正确的方法。

标签: swift

解决方案


首先,它是BinaryInteger,不是Numeric

其次,T遵守U相同的协议并不意味着它们将是相同的类型。因此,您的返回值不正确。尝试不同的值,例如:Bool、String、Int、...

你可以在这里找到更多信息


推荐阅读