Swift中BinaryFloatingPoint泛型调用log10()编译报错,需遵循什么协议?
解决Swift泛型方法中log10调用的编译错误
这个问题我之前处理过,核心原因很简单:你调用的log10(_:)方法并不是BinaryFloatingPoint协议的默认成员,所以得给泛型参数T加上额外的协议约束才行。
具体来说,你需要让T同时遵循FloatingPointMath协议——这个协议是Swift 5.9及以后版本引入的,专门封装了log10、sin、cos这类常用数学函数。
修改后的代码可以写成两种形式:
第一种是在where从句里追加约束:
class func magnitude<T: BinaryFloatingPoint>(_ n: T) where T: CVarArg, T: FloatingPointMath { // … let p = Int(log10(n)) // … }
第二种是直接把多个协议合并写在泛型参数的约束里,看起来更简洁:
class func magnitude<T: BinaryFloatingPoint & CVarArg & FloatingPointMath>(_ n: T) { // … let p = Int(log10(n)) // … }
如果你的项目还在使用Swift 5.8或更早的版本,FloatingPointMath还没出现,那可以退而求其次,把n转换成Double后再调用log10,比如:
let p = Int(log10(Double(n)))
不过这种方式会有精度损失的风险,所以优先推荐升级Swift版本并使用FloatingPointMath约束的方案。
内容的提问来源于stack exchange,提问作者Stéphane de Luca
相关产品推荐
相关产品推荐

