是否还有一个快捷方式可以防止结果在Swift中为nil或empty?

时间:2015-10-15 14:28:08

标签: swift

我可以使用以下表达式来防止变量为nil:

let result: String = someTextField.text ?? ""

是否还有一条快捷方式可以阻止result在Swift中为空或空?

4 个答案:

答案 0 :(得分:0)

您可以尝试使用.isEmpty方法进行检查,或使用默认值

let result = (someTextField.text ?? "").isEmpty ? "default" : string

答案 1 :(得分:0)

??被称为 Nil Coalescing Operator

  

nil合并运算符(a ?? b)如果包含值,则展开可选a;如果a为n,则返回默认值b。表达式a始终是可选类型。表达式b必须与存储在。

中的类型相匹配

根据您的提问,??只是阻止result成为nil的捷径。

并没有阻止result成为nil和空的快捷方式。由于空为string,因此与nil不同。

答案 2 :(得分:0)

以下是解决方案:

let result: String = 
         someTextField.text?.isEmpty() != false ? "is null or empty" :  someTextField.text!

答案 3 :(得分:0)

是的,您可以使用???执行此操作,但如果您愿意,可以定义自己的捷径。

// So we can apply to any type by extending the type to conform to the protocol
protocol CanBeEmpty
{
    var isEmpty: Bool { get }
}

extension String: CanBeEmpty
{
    // String doesn't need the var cos it already has it
}

extension Optional where Wrapped: CanBeEmpty
{
    func unwrappedOrDefault(def: Wrapped) -> Wrapped
    {
        switch self
        {
        case .None:
            return def
        case .Some(let wrapped):
            return wrapped.isEmpty ? def : wrapped
        }
    }
}

let foo: String? = "foo"
let fooUnwrapped = foo.unwrappedOrDefault("default") // "foo"
let bar : String? = ""                        
let barUnwrapped = bar.unwrappedOrDefault("default") // "default"
let baz: String? = nil
let bazUnwrapped = baz.unwrappedOrDefault("default") // "default"

如果您认为输入太多,请创建一个运算符

infix operator ??? {}

func ???<T: CanBeEmpty> (a: Optional<T>, b: T) -> T
{
    return a.unwrappedOrDefault(b)
}

foo ??? "default" // "foo"
bar ??? "default" // "default"
baz ??? "default" // "default"