Swift 4:将 Bool 选项打印为未包装的 true 或 false 或包装的 nil?

Posted

技术标签:

【中文标题】Swift 4:将 Bool 选项打印为未包装的 true 或 false 或包装的 nil?【英文标题】:Swift 4: Printing out Bool optionals as either unwrapped true or false or as wrapped nil? 【发布时间】:2017-10-25 13:06:01 【问题描述】:

基本上,我想将以下值打印为“true”、“false”或“nil”。如果我尝试只使用包装后的值,我会得到我想要的“nil”,但会获得不需要的“Optional(true)”或“Optional(false)”。如果我强制解开该值并且该值为 nil,则会出现致命错误。我尝试了下面的代码,因为我已经看到它适用于字符串,但是因为“nil”不是 Bool 类型,所以它不被接受。有什么解决方案吗?

var isReal: Bool?
String("Value is \(isReal ?? "nil")")

我正在导出到一个 csv 文件,知道这个值是真还是假或者还没有被检查是很有用的。

【问题讨论】:

【参考方案1】:

如果您想要单线:

var isReal: Bool?
let s = "Value is \(isReal.map  String($0)  ?? "nil")"
print(s) // "Value is nil"

或者使用自定义扩展:

extension Optional 
    var descriptionOrNil: String 
        return self.map  "\($0)"  ?? "nil"
    

你可以的

var isReal: Bool?
let s = "Value is \(isReal.descriptionOrNil)"
print(s) // "Value is nil"

这适用于所有可选类型。

【讨论】:

评论不用于扩展讨论;这个对话是moved to chat。【参考方案2】:

只需做一个可选的绑定并做这个:

if let value = isReal 
   print(value) // will either be true or false
 else 
   // isReal is nil

【讨论】:

我必须把我的字符串分开然后对吗?我有几个这样的值,我将它们附加到 for 循环中的字符串。有没有办法像部分展开一样做到这一点? 告诉我string的样子,我会看看@ANoobSwiftly csvFileString.append("\(key),\(item.url),\(item.dateAdded),\(item.isReal),\(item.lowestPrice),\(item.中值价格),\(item.volumeSold24Hr)\n") 我不知道当我在这里发布时屏幕上的某些格式发生了什么,但基本上是放置在字符串中的 7 个变量; 4 个是可选的... 2 个 Doubles,一个 Bool 和一个 Int。 @ANoobSwiftly 你可以在一个if 行中解开一堆变量:if let var1 = var1, let var2 = var2, let var3 = var3 /*... etc. */ 【参考方案3】:

虽然我建议使用 Rashwan L's answer 中提到的可选绑定来实现它,但如果您出于某种原因打算将其声明为一个内衬字符串,您可以简单地这样做:

var isReal: Bool?
let myString = isReal != nil ? "Value is \(isReal!)" : "Value is nil"

【讨论】:

@LeoDabus 为什么你认为它会比我提到的更好?感谢您提前考虑。

以上是关于Swift 4:将 Bool 选项打印为未包装的 true 或 false 或包装的 nil?的主要内容,如果未能解决你的问题,请参考以下文章

在swift 4中没有让用户当前位置

Swift:在 AFNetworking 调用中关闭的未包装选项

BOOL 与 Swift 4.1 中的 Bool 不兼容

Swift 4 将参数添加到 URLRequest 完成处理程序

在 Swift 中,我如何避免选项和 nil 对象引用?

为啥 Swift 零合并三元运算符不返回未包装类型?