来自可选双精度的Swift字符串

来自可选双精度的Swift字符串,swift,Swift,当Swift中的值为零时,是否有指定占位符文本的快捷方式 现在我有: let myText:String! if myDouble != nil{ myText = "\(myDouble!)" }else{ myText = "Value not provided" } 这是可行的,但一直这样做很烦人。有没有办法做类似的事情 let myText:String = "\(myDouble ?? "Value no provided")" 这会失败,因为它需要一个默认的双精度值,但我

当Swift中的值为零时,是否有指定占位符文本的快捷方式

现在我有:

let myText:String!
if myDouble != nil{
  myText = "\(myDouble!)"
}else{
  myText = "Value not provided"
}
这是可行的,但一直这样做很烦人。有没有办法做类似的事情

let myText:String = "\(myDouble ?? "Value no provided")"
这会失败,因为它需要一个默认的双精度值,但我确实需要一个字符串值。

这应该可以:

let myText = myDouble != nil ? String(myDouble!) : "Value not provided"

您可以使用
map
和nil合并:

let myText = myDouble.map { String($0) } ?? "Value not provided"
如果
myDouble
nil
,则
map
的结果为
nil
,结果为
后的值

如果
myDouble
不是
nil
,结果是
map
的输出,它从
Double
创建一个字符串


有关更多详细信息,请参阅Swift标准库中
可选
枚举的
映射
功能的文档。

这样做似乎是合理的

let myDouble: Double? = Double(3.0)
let myText = myDouble?.description ?? "Value not provided"

如果
myDouble
nil
,则
myText
“未提供值”
。如果
myDouble
不是
nil
,则为其分配数字的字符串表示形式。

我认为最好的方法是将扩展设置为可选,其中Double是包装元素:

extension Optional where Wrapped == Double  {

    var stringValue: String {
        guard let me = self else { return "No Value Provided" }
        return "\(me)"
    }
}

// Use it like this:

myDouble.stringValue
另一种方法是使您的自定义运算符如下所示:

public func ??(rhd: Double?, lhd: String) -> String {
    if let unwrapped = rhd {
        return String(unwrapped)
    } else {
        return lhd
    }
}
现在,您的行
让myText:String=“\(myDouble??“未提供值”)”
起作用。
如果你什么都不懂,请告诉我。

如果你经常这样做,那么重构并生成一个函数。@Teejay我不知道这是什么意思。任何认识斯威夫特的人都能读懂那一行代码。如果您有特定的问题,请提问。@rmaddy检查此项:。开始的时候,它说:“一开始,这可能看起来很奇怪,因为我们调用了一个可选的函数。”@Teejay“我从来没有在与集合不同的地方使用过map。”而且我在18岁之前从来没有做过纳税。也许是时候开始了?“任何一个非常了解斯威夫特的人”好吧,祝贺你,你现在对斯威夫特有了更多的了解!不需要在那里使用闭包。只需将字符串初始值设定项传递给map方法
map(String.init)
description
的输出显示给用户从来都不是一个好主意。这更像是一个调试工具。@rmaddy实际上,
debugDescription
就是为了这个目的而存在的。无论如何,访问对象描述的正确方法,如参考文献中所述,是通过
String(description:object)
,但在这种特定情况下,它返回
可选(数字)
。这在两种情况下都是模糊的、不明显的行为。我强烈反对。你说的不明显的行为是什么意思?在可选双精度上调用stringValue,要么没有提供值,要么是字符串中的值。通过查看
optionalDouble.stringValue
,我怎么知道如果双精度为
nil
,结果将是
“无值验证”
?这看起来更像是一件奇怪的事情。问题是关于这个。您可以在文件的作用域中设置私有扩展名,该扩展名仅供您使用。当然可以,但在代码中阅读
optionaldough.stringValue
的人不会知道这个问题。迟早,他会需要在多个地方进行
Double?
->
String
转换,这些代码最终会出现在一些共享的UTIL文件或库中。只需坚持使用
optionalDouble.map(String.init)??“默认值”
。它更加惯用,并且使得
nil
案例更加明确。它也更适合国际化,因为默认值可以是本地化字符串。