在Optional Double上调用方法以转换为String

金能

为了方便将浮点数格式化为具有各种精度级别的字符串,我编写了此代码。

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浮点数的初始化程序:

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)    // ""

另一个选择是自由功能,再次使用Optionalnil正如Sulthan所说,您当然也可以让呼叫者选择解决的方法。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将Optional <Integer>转换为Optional <Long>的好方法

如何将Mono <Map <String,Optional <String >>>>>转换为Flux <Tuple <String,Optional <String >>>>>

从TextInputDialog将Optional <String>转换为Integer时出错

将Optional(Set([[6“,” 14“]))转换为[String]

在Java 8中,将Optional.empty中的空字符串的Optional <String>转换为

将nullptr转换为std :: optional

如何将Optional转换为OptionalInt?

将Optional <T>转换为Stream <T>

'[任务]?' 不能转换为“ Optional <[Any]>”

将std :: vector <boost :: optional <double >>转换为std :: vector <double>

为什么我不能在可选链类型上调用 Optional 方法?

如何使用Optional调用类方法

boost :: optional和类型转换

Swift-Optional对象的集合.first返回double包装的Optional

即使Optional包含值,也会调用Optional.orElse的参数

如何正确返回方法的Optional <>?

将一个std :: optional转换为另一个std :: optional

如何在 Spring JPA 中将 Optional<Entity> 转换为 Optional<EntityDTO>?

Java 8将Optional <Object>强制转换为long,int,String或Foo

不能转换为 java.base/java.util.Optional

如何将Optional <T>转换为Stream <T>?

在Swift中将Optional <Any>强制转换为NSString

是否可以将Any强制转换为Optional?

方法参考中的返回类型错误:无法将Employee转换为Optional <U>

将Map <Object,Optional <Object >>转换为Map <Object,Object>的最佳方法?

如何从java.util.Optional方法调用链移植到Guava Optional?

在访问值之前调用“ Optional#isPresent()”

使用std :: optional参数调用函数

如何向上转换静态 std::optional