为空的非零字符串合并 Swift 运算符

Posted

技术标签:

【中文标题】为空的非零字符串合并 Swift 运算符【英文标题】:Coalescing Swift operator for an empty non-nil string 【发布时间】:2015-04-04 16:27:30 【问题描述】:

我在 Swift 中有一个字符串变量:

let foo = "bar"

但它也可以是任何其他任意字符串。现在我想做以下事情:

let bar = ... // either the value of foo, or if foo is "", it will be "default"

我查找了“合并运算符”,看来这是正确的方向。我用下面的代码试了一下:

let bar = foo ?? "default"

但是好像foo为空的时候还是会取这个,不会设置default为值。

我假设合并运算符仅适用于 nil 值,而不适用于空字符串。但是,是否有一种解决方案可以测试我的值是否为空字符串并分配默认值?我不能使用 if/else,因为它将位于一个类中。

【问题讨论】:

【参考方案1】:

""nil 之间存在差异。照原样,您将 foo 定义为“bar”,因此它是非可选的,因此它永远不会返回 nil。听起来您需要的是三元运算符:

let bar = foo.isEmpty ? foo : "default"

此外,为了扩展 return true 的答案,您可以创建一个运算符来处理可选字符串和空字符串,如下所示:

infix operator ???? 
func ???? (lhs: String?, rhs: String) -> String 
    if let s = lhs 
        if !s.isEmpty 
            return s
        
        
    return rhs

【讨论】:

您选择使用 4 个问号而不是 return true 的 3 个问号是否有特殊原因(如果您还记得 ?)?【参考方案2】:

或者创建你自己的操作符:

infix operator ??? 
func ??? (lhs: String, rhs: String) -> String 
    if lhs.isEmpty 
        return rhs
    
    return lhs

然后:let bar = foo ??? "default"

【讨论】:

以上是关于为空的非零字符串合并 Swift 运算符的主要内容,如果未能解决你的问题,请参考以下文章

空合并运算符与 value()

有没有更优雅的方法来添加可为空的整数?

为啥条件运算符不能正确地允许使用“null”来分配给可为空的类型? [复制]

命令 PhaseScriptExecution 因 R.swift 的非零退出代码而失败

C# 合并运算符抛出

如何使我的字符串属性可以为空?