检查字符串是否为空并且为空

Dea*_*ean 120 string optional is-empty swift

有没有一种方法来检查字符串nil""斯威夫特?在Rails中,我可以blank()用来检查.

我目前有这个,但它似乎有点矫枉过正:

    if stringA? != nil {
        if !stringA!.isEmpty {
            ...blah blah
        }
    }
Run Code Online (Sandbox Code Playgroud)

jrc*_*jrc 196

如果您正在处理可选字符串,则可以:

(string ?? "").isEmpty
Run Code Online (Sandbox Code Playgroud)

如果??nil合并运算符为非nil,则返回左侧,否则返回右侧.

您也可以像这样使用它来返回默认值:

(string ?? "").isEmpty ? "Default" : string!
Run Code Online (Sandbox Code Playgroud)


Rya*_*yan 72

您也许可以使用if-let-where子句:

斯威夫特3:

if let string = string, !string.isEmpty {
    /* string is not blank */
}
Run Code Online (Sandbox Code Playgroud)

斯威夫特2:

if let string = string where !string.isEmpty {
    /* string is not blank */
}
Run Code Online (Sandbox Code Playgroud)

  • 这适用于Swift 3:`if let string = string,!string.isEmpty {/*string not blank*/} (3认同)
  • 不能使用Swift 2,得到这个运行时错误`致命错误:在解开一个Optional值时意外地发现了nil但是我的常量`string`有一个字符串数据. (2认同)

Sur*_*gch 26

使用guard声明

在我了解这个guard声明之前,我正在使用Swift一段时间.现在我是一个忠实粉丝.它与if语句类似地使用,但它允许提前返回,并且通常可以提供更清晰的代码.

要在检查时使用guard来确保字符串既不是空也不是空,您可以执行以下操作:

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)
Run Code Online (Sandbox Code Playgroud)

这将打开可选字符串并检查它是否一次全部为空.如果它是nil(或为空),则立即从函数(或循环)返回,并忽略其后的所有内容.但是如果守护声明通过,那么你可以安全地使用你的解包字符串.

也可以看看

  • @KangByul我不明白你的"小心"评论的意思,我认为它让人们从一个很好的解决方案中吓跑了,返回声明显然是在卫士的其他声明中,我认为你应该删除你的评论 (3认同)

Ken*_* Ko 25

如果您使用的是Swift 2,这是我的同事提出的一个示例,它在可选字符串上添加了isNilOrEmpty属性:

protocol OptionalString {}
extension String: OptionalString {}

extension Optional where Wrapped: OptionalString {
    var isNilOrEmpty: Bool {
        return ((self as? String) ?? "").isEmpty
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以在可选字符串本身上使用isNilOrEmpty

func testNilOrEmpty() {
    let nilString:String? = nil
    XCTAssertTrue(nilString.isNilOrEmpty)

    let emptyString:String? = ""
    XCTAssertTrue(emptyString.isNilOrEmpty)

    let someText:String? = "lorem"
    XCTAssertFalse(someText.isNilOrEmpty)
}
Run Code Online (Sandbox Code Playgroud)


Sut*_*tra 13

var str: String? = nil

if str?.isEmpty ?? true {
    print("str is nil or empty")
}

str = ""

if str?.isEmpty ?? true {
    print("str is nil or empty")
}
Run Code Online (Sandbox Code Playgroud)

  • 优雅但尴尬;),“真实”有点摆脱直觉 (2认同)

Ima*_*tit 11

使用Swift 5,您可以使用boolean属性实现类型的Optional扩展,String如果可选字符串没有值或为空,则返回boolean属性:

extension Optional where Wrapped == String {

    var isNilOrEmpty: Bool {
        return self?.isEmpty ?? true
    }

}
Run Code Online (Sandbox Code Playgroud)

但是,通过遵守protocol来String实现isEmpty属性Collection。因此,我们可以将前一个代码的通用约束(Wrapped == String)替换为一个宽泛的约束(),Wrapped: Collection从而使ArrayDictionary同时Set也可以受益于我们的新isNilOrEmpty属性:

extension Optional where Wrapped: Collection {

    var isNilOrEmpty: Bool {
        return self?.isEmpty ?? true
    }

}
Run Code Online (Sandbox Code Playgroud)

Strings结合使用:

let optionalString: String? = nil
print(optionalString.isNilOrEmpty) // prints: true
Run Code Online (Sandbox Code Playgroud)
let optionalString: String? = ""
print(optionalString.isNilOrEmpty) // prints: true
Run Code Online (Sandbox Code Playgroud)
let optionalString: String? = "Hello"
print(optionalString.isNilOrEmpty) // prints: false
Run Code Online (Sandbox Code Playgroud)

Arrays结合使用:

let optionalArray: Array<Int>? = nil
print(optionalArray.isNilOrEmpty) // prints: true
Run Code Online (Sandbox Code Playgroud)
let optionalArray: Array<Int>? = []
print(optionalArray.isNilOrEmpty) // prints: true
Run Code Online (Sandbox Code Playgroud)
let optionalArray: Array<Int>? = [10, 22, 3]
print(optionalArray.isNilOrEmpty) // prints: false
Run Code Online (Sandbox Code Playgroud)

资料来源:

  • 我喜欢这个,我要做的唯一调整是将其从“isNilOrEmpty”重命名为“isEmptyOrNil”以匹配前缀,这样就可以通过相同的自动完成模式轻松找到它。我注意到与我一起工作的同事更多地采用了这个扩展,只是因为他们发现了这种方式。 (3认同)

Sir*_*lot 9

我知道这个问题有很多答案,但是它们(在我看来)中似乎没有一个方便验证UITextField数据,这是使用它的最常见情况之一:

extension Optional where Wrapped == String {
    var isNilOrEmpty: Bool {
        return self?.trimmingCharacters(in: .whitespaces).isEmpty ?? true
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以使用

textField.text.isNilOrEmpty
Run Code Online (Sandbox Code Playgroud)

.trimmingCharacters(in:.whitespaces)如果不将空格视为空字符串,或者将其用于更复杂的输入测试,也可以跳过

var isValidInput: Bool {
    return !isNilOrEmpty && self!.trimmingCharacters(in: .whitespaces).characters.count >= MIN_CHARS
}
Run Code Online (Sandbox Code Playgroud)


Pri*_*ngo 7

我会推荐.

if stringA.map(isEmpty) == false {
    println("blah blah")
}
Run Code Online (Sandbox Code Playgroud)

map如果是可选项,则应用函数参数.Some.
如果让可选的绑定,操场捕获还显示了新Swift 1.2的另一种可能性.

在此输入图像描述


Ale*_*lav 7

如果你想要将字符串作为非可选字符串访问,你应该使用Ryan的答案,但是如果你只关心字符串的非空虚,我的首选简写是

if stringA?.isEmpty == false {
    ...blah blah
}
Run Code Online (Sandbox Code Playgroud)

由于==使用可选的布尔值工作正常,我认为这使代码可读而不会模糊原始意图.

如果你想检查相反的结果:如果字符串是nil或者"",我更愿意明确检查这两种情况以显示正确的意图:

if stringA == nil || stringA?.isEmpty == true {
    ...blah blah
}
Run Code Online (Sandbox Code Playgroud)