检查字符串是否为空和后卫

问题描述 投票:107回答:21

有没有办法在Swift中检查nil""的字符串?在Rails中,我可以使用blank()来检查。

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

    if stringA? != nil {
        if !stringA!.isEmpty {
            ...blah blah
        }
    }
swift string optional is-empty
21个回答
186
投票

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

(string ?? "").isEmpty

?? nil合并算子返回左侧,如果它是非零,否则它返回右侧。

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

(string ?? "").isEmpty ? "Default" : string!

3
投票

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?") } 

3
投票

Swift 3用于检查空字符串的最佳方式

if !string.isEmpty{

// do stuff

}

2
投票

您可以创建自己的自定义函数,如果这是您希望做的很多事情。

func isBlank (optionalString :String?) -> Bool {
    if let string = optionalString {
        return string.isEmpty
    } else {
        return true
    }
}



var optionalString :String? = nil

if isBlank(optionalString) {
    println("here")
}
else {
    println("there")
}

2
投票

Swift 3解决方案使用可选的unwrapped值并检查布尔值。

if (string?.isempty == true) {
    // Perform action
}

1
投票

创建一个String类扩展:

extension String
{   //  returns false if passed string is nil or empty
    static func isNilOrEmpty(_ string:String?) -> Bool
    {   if  string == nil                   { return true }
        return string!.isEmpty
    }
}// extension: String

请注意,如果字符串包含一个或多个空格,则返回TRUE。要将空字符串视为“空”,请使用...

return string!.trimmingCharacters(in: CharacterSet.whitespaces).isEmpty

......而是。这需要基金会。

因此使用它......

if String.isNilOrEmpty("hello world") == true 
{   print("it's a string!")
}

1
投票

Swift 3这很好用于检查字符串是否真的是空的。因为当有空格时isEmpty返回true。

extension String {
    func isEmptyAndContainsNoWhitespace() -> Bool {
        guard self.isEmpty, self.trimmingCharacters(in: .whitespaces).isEmpty
            else {
               return false
        }
        return true
    }
}

例子:

let myString = "My String"
myString.isEmptyAndContainsNoWhitespace() // returns false

let myString = ""
myString.isEmptyAndContainsNoWhitespace() // returns true

let myString = " "
myString.isEmptyAndContainsNoWhitespace() // returns false

1
投票

你应该做这样的事情: if !(string?.isEmpty ?? true) { //Not nil nor empty }

Nil合并运算符检查可选项是否为nil,如果它不是nil,则检查其属性,在本例中为isEmpty。因为此可选项可以为nil,所以您提供了一个默认值,当您的optional是nil时将使用该值。


0
投票

在处理从本地数据库到服务器的值传递时,反之亦然,我在使用?和s时遇到了太多麻烦。

所以我创建了一个Swift3.0实用程序来处理null情况,我几乎可以完全避免代码中的?和s。

func str(_ string: String?) -> String {
    return (string != nil ? string! : "")
}

例如: -

之前:

    let myDictionary: [String: String] = 
                      ["title": (dbObject?.title != nil ? dbObject?.title! : "")]

之后:

    let myDictionary: [String: String] = 
                        ["title": str(dbObject.title)]

当需要检查有效字符串时,

    if !str(dbObject.title).isEmpty {
        //do stuff
    }

这节省了我在编写合理有意义的代码之后,不得不经历添加和删除多个?和's'的麻烦。


0
投票

使用三元运算符(也称为条件运算符,C++ forever!):

if stringA != nil ? stringA!.isEmpty == false : false { /* ... */ }

stringA!力量展开只发生在stringA != nil,所以它是安全的。 == false详细程度比!(stringA!.isEmpty)中的另一个感叹号更具可读性。

我个人更喜欢略有不同的形式:

if stringA == nil ? false : stringA!.isEmpty == false { /* ... */ }

在上面的语句中,很明显当变量是if时,整个nil块不会执行。


0
投票

从UITextField获取值并检查nilempty字符串时很有帮助

@IBOutlet weak var myTextField: UITextField!

继承你的功能(当你点击button)从UITextField获取字符串并做一些其他的东西

@IBAction func getStringFrom_myTextField(_ sender: Any) {

guard let string = myTextField.text, !(myTextField.text?.isEmpty)!  else { return }
    //use "string" to do your stuff.
}

这将照顾nil值以及empty字符串。

它对我来说非常好用。


72
投票

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

斯威夫特3:

if let string = string, !string.isEmpty {
    /* string is not blank */
}

斯威夫特2:

if let string = string where !string.isEmpty {
    /* string is not blank */
}

0
投票

使用isEmpty

"Hello".isEmpty  // false
"".isEmpty       // true

使用allSatisfy

extension String {
  var isBlank: Bool {
    return allSatisfy({ $0.isWhitespace })
  }
}

"Hello".isBlank        // false
"".isBlank             // true

使用可选字符串

extension Optional where Wrapped == String {
  var isBlank: Bool {
    return self?.isBlank ?? true
  }
}

var title: String? = nil
title.isBlank            // true
title = ""               
title.isBlank            // true

参考:https://useyourloaf.com/blog/empty-strings-in-swift/


-2
投票

你可以使用这个功能

 class func stringIsNilOrEmpty(aString: String) -> Bool { return (aString).isEmpty }

24
投票

如果您使用的是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)
}

24
投票

Using the guard statement

在我了解了guard声明之前,我正在使用Swift一段时间。现在我是一个忠实粉丝。它与if语句类似地使用,但它允许使用early return,并且通常只需要更清晰的代码。

要在检查时使用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)

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

See Also


12
投票
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")
}

9
投票

我知道这个问题有很多答案,但是它们(我认为)中没有一个像验证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
}

9
投票

使用Swift 5,您可以为Optional类型实现String扩展,其布尔属性在可选字符串没有值或为空时返回:

extension Optional where Wrapped == String {

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

}

然而,String通过符合协议isEmpty实现Collection财产。因此,我们可以用更宽的一个(Wrapped == String)替换先前代码的通用约束(Wrapped: Collection),以便ArrayDictionarySet也有益于我们新的isNilOrEmpty属性:

extension Optional where Wrapped: Collection {

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

}

用于Strings:

let optionalString: String? = nil
print(optionalString.isNilOrEmpty) // prints: true
let optionalString: String? = ""
print(optionalString.isNilOrEmpty) // prints: true
let optionalString: String? = "Hello"
print(optionalString.isNilOrEmpty) // prints: false

用于Arrays:

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

资料来源:


7
投票

我会推荐。

if stringA.map(isEmpty) == false {
    println("blah blah")
}

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


7
投票

如果你想以非可选方式访问字符串,你应该使用Ryan's Answer,但如果你只关心字符串的非空虚,我的首选简写是

if stringA?.isEmpty == false {
    ...blah blah
}

由于==在可选的布尔值下运行良好,我认为这使得代码可读而不会模糊原始意图。

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

if stringA == nil || stringA?.isEmpty == true {
    ...blah blah
}
© www.soinside.com 2019 - 2024. All rights reserved.