在Swift中有没有一种方法可以检查字符串是否为 nil
和 ""
? 在Rails中,我可以使用 blank()
进行检查。
我目前有这个,但似乎过于复杂:
if stringA? != nil {
if !stringA!.isEmpty {
...blah blah
}
}
在Swift中有没有一种方法可以检查字符串是否为 nil
和 ""
? 在Rails中,我可以使用 blank()
进行检查。
我目前有这个,但似乎过于复杂:
if stringA? != nil {
if !stringA!.isEmpty {
...blah blah
}
}
如果你正在处理可选字符串,那么这个方法可以使用:
(string ?? "").isEmpty
??
零合并运算符返回左侧值,如果它不为 nil,则返回左侧值,否则返回右侧值。(string ?? "").isEmpty ? "Default" : string!
你或许可以使用 if-let-where 语句:
Swift 3:
if let string = string, !string.isEmpty {
/* string is not blank */
}
Swift 2:
if let string = string where !string.isEmpty {
/* string is not blank */
}
fatal error: unexpectedly found nil while unwrapping an Optional value
,但我的常量string
具有字符串数据。 - Nagendra Raoif let string = string, !string.isEmpty { /* 字符串不为空 */ }
- EricSguard let
是一种替代方法。然而,在这里的where子句中没有任何内容被解包(!是一个布尔否定)。 - Ryan使用 Swift 5,您可以为 String
类型实现一个 Optional
扩展,其中包含一个布尔属性,该属性返回可选字符串是否为空或无值:
extension Optional where Wrapped == String {
var isEmptyOrNil: Bool {
return self?.isEmpty ?? true
}
}
但是,String
通过遵循协议 Collection
实现了属性 isEmpty
。因此,我们可以用更广泛的约束条件 (Wrapped: Collection
) 来替换先前代码中的泛型约束条件 (Wrapped == String
),以便让 Array
、Dictionary
和 Set
也能受益于我们的新 isEmptyOrNil
属性:
extension Optional where Wrapped: Collection {
var isEmptyOrNil: Bool {
return self?.isEmpty ?? true
}
}
使用 String
:
let optionalString: String? = nil
print(optionalString.isEmptyOrNil) // prints: true
let optionalString: String? = ""
print(optionalString.isEmptyOrNil) // prints: true
let optionalString: String? = "Hello"
print(optionalString.isEmptyOrNil) // prints: false
使用 Array
:
let optionalArray: Array<Int>? = nil
print(optionalArray.isEmptyOrNil) // prints: true
let optionalArray: Array<Int>? = []
print(optionalArray.isEmptyOrNil) // prints: true
let optionalArray: Array<Int>? = [10, 22, 3]
print(optionalArray.isEmptyOrNil) // prints: false
Sources:
isNilOrEmpty
改为 isEmptyOrNil
,以匹配前缀,这样可以通过相同的自动完成模式轻松找到它。我注意到我的同事们更容易发现并采用此扩展程序。 - Aaronguard
语句在了解 guard
语句之前,我已经使用 Swift 一段时间了。现在我是它的忠实粉丝。它类似于 if
语句,但允许进行 早期返回,并且通常使代码更加清晰简洁。
要使用 guard 来检查字符串既不是 nil 也不为空,请执行以下操作:
let myOptionalString: String? = nil
guard let myString = myOptionalString, !myString.isEmpty else {
print("String is nil or empty.")
return // or break, continue, throw
}
/// myString is neither nil nor empty (if this point is reached)
print(myString)
这段代码会展开可选字符串并同时检查它是否为空。如果它是nil(或者空),那么你会立即从函数(或循环)中返回,忽略其后的所有内容。但是,如果guard语句通过了,那么你可以安全地使用已展开的字符串。
nil
或空,则不希望调用print(myString)
。如果您需要在nil
或空String
之后继续执行,则应使用if let
而不是guard
。 - Suragch如果您正在使用Swift 2,这里有一个我的同事编写的示例,它在可选字符串上添加了isNilOrEmpty属性:
protocol OptionalString {}
extension String: OptionalString {}
extension Optional where Wrapped: OptionalString {
var isNilOrEmpty: Bool {
return ((self as? String) ?? "").isEmpty
}
}
您可以在可选字符串本身上使用isNilOrEmpty。func testNilOrEmpty() {
let nilString:String? = nil
XCTAssertTrue(nilString.isNilOrEmpty)
let emptyString:String? = ""
XCTAssertTrue(emptyString.isNilOrEmpty)
let someText:String? = "lorem"
XCTAssertFalse(someText.isNilOrEmpty)
}
where Wrapped:
必须指定一个协议而不是一个类型。 - Adam JohnsisNilOrEmpty
改为 hasValue
(或类似的名称),并且反转逻辑。 - Islamvar str: String? = nil
if str?.isEmpty ?? true {
print("str is nil or empty")
}
str = ""
if str?.isEmpty ?? true {
print("str is nil or empty")
}
我知道这个问题已经有很多答案了,但是在我的观点中,没有一个答案比这种验证UITextField
数据更加方便,而这也是使用它最常见的情况之一。
extension Optional where Wrapped == String {
var isNilOrEmpty: Bool {
return self?.trimmingCharacters(in: .whitespaces).isEmpty ?? true
}
}
你可以直接使用
textField.text.isNilOrEmpty
如果您不将空格视为空字符串,或者需要进行更复杂的输入测试,则可以跳过.trimmingCharacters(in:.whitespaces)
var isValidInput: Bool {
return !isNilOrEmpty && self!.trimmingCharacters(in: .whitespaces).characters.count >= MIN_CHARS
}
if stringA?.isEmpty == false {
...blah blah
}
由于 ==
可以与可选布尔值良好搭配使用,我认为这使得代码易读而不会掩盖原意。
如果您想检查相反的情况:如果字符串是nil
或""
,我更喜欢显式地检查两种情况以显示正确的意图:
if stringA == nil || stringA?.isEmpty == true {
...blah blah
}
if stringA.map(isEmpty) == false {
println("blah blah")
}
map
函数会在可选项是.Some
的情况下应用函数参数。
Playground示例还展示了新的Swift 1.2中通过if let
可选项绑定的另一种可能性。
SWIFT 3
extension Optional where Wrapped == String {
/// Checks to see whether the optional string is nil or empty ("")
public var isNilOrEmpty: Bool {
if let text = self, !text.isEmpty { return false }
return true
}
}
可选字符串使用方式如下:
if myString.isNilOrEmpty { print("Crap, how'd this happen?") }