我可以使用以下表达式来防止变量为nil:
let result: String = someTextField.text ?? ""
是否还有一条快捷方式可以阻止result
在Swift中为空或空?
答案 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"