swift - 调用可选 double 值上的方法以转换为字符串

标签 swift extension-methods option-type

我编写此代码是为了轻松地将 float 格式化为具有不同精度级别的字符串。

extension FloatingPoint {
    func str(_ precision: Int) -> String {
        return String(format: "%."+String(precision)+"f", self as! CVarArg)
    }
}

它非常适合具有浮点类型的非可选变量:

var myDouble: Double = 3.1415
var text = myDouble.str(2) // sets text = "3.14"

有没有办法让这样的东西适用于可选的Double

var myNilDouble: Double? = nil
var text = myNilDouble.str(2) // I'd like it to set text = "" 

我希望实现支持 nil 和非 nil 转换为字符串。

最佳答案

您没有在 Double 上调用该方法,您在 Optional<Double> 上调用它;完全不同的类型。所以你需要该方法存在于 Optional 上:

extension Optional where Wrapped : FloatingPoint {
    func string(usingPrecision precision: Int) -> String {
        guard let double = self else { return "" }
        return double.str(precision)
    }
}

不过我不喜欢这个界面;我不认为是Optional的工作是决定发出一个空字符串。相反,我建议在 String 上使用初始化程序本身需要 Optional float :

import Foundation

extension String {
    init<N : FloatingPoint>(_ value: N?, precision: Int) {
        guard let value = value else { self.init(); return }
        self.init(format: "%.\(precision)f", value as! CVarArg)
    }
}

现在你写

let value: Double? = nil
let text = String(value, precision: 2)    // ""

另一个选项是免费函数,同样采用 Optional 。 (当然,您也可以将 nil 的解析结果设为调用者的选择,正如 Sulthan 所说。)

关于swift - 调用可选 double 值上的方法以转换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54485013/

相关文章:

xcode - 没想到发现无

swift - 不使用@objc 的 swift 可选协议(protocol)方法

swift - 使用 Swift 将自定义字体添加到 macOS 应用程序

c# - 除非显式设置泛型类型,否则不会调用 Nullable<T> 上的扩展方法

c# - 子列表的补充列表

c# - 带有扩展方法的 List<T> 的深拷贝

c# - C# 中的 Maybe/Option monad

swift - ScrollRectToVisible 显示匹配的搜索字符串以滚动到 UITextView 的中间 View

ios - 如何获取位置坐标以在另一个类中更新?

ios - swift 中的 addsubview 命令后动画未运行