在 Swift 中如何检查空字符串?

192

在Objective C中,可以使用以下方法检查字符串:

if ([myString isEqualToString:@""]) {
    NSLog(@"myString IS empty!");
} else {
    NSLog(@"myString IS NOT empty, it is: %@", myString);
}

如何在Swift中检测空字符串?


4
你的目标代码有误。它在空字符串上会产生严重的失败。在Objective-C中,我们通常使用以下代码:如果(myString.length) { '是一个具有长度的字符串' },这种方法同样适用于空字符串。这很简单易懂。 - Tom Andersen
16个回答

268

现在有内置的能力可以使用.isEmpty来检测空字符串:

if emptyString.isEmpty {
    print("Nothing to see here")
}

Apple的预发布文档:"字符串和字符"


1
你也可以使用isEqualToString,如果你用NSString初始化变量('变量emptyString:NSString')的话非常方便:emptyString.isEqualToString("")。 - Sven
2
当用户输入空格时,此条件将失败。 - Shanu Singh
更新:这里是 isEmpty: https://developer.apple.com/documentation/swift/string/2946268-isempty - chrisjlee

132

检查字符串是否为nil或空的简洁方法是:

var myString: String? = nil

if (myString ?? "").isEmpty {
    print("String is nil or empty")
}

这很美,但是你如何使用非可选值?强制解包吗? - Nostalg.io
5
你可以选择隐式解包或强制解包,也可以使用以下方式:if let myString = myString where !myString.isEmpty { ... },这样会检查字符串是否为非空。 - Albert Bori

67

我正在完全重写我的回答(再次)。这一次是因为我成为了 guard语句提前返回的粉丝。它可以让代码更加简洁。

非可选字符串

检查是否长度为零。

let myString: String = ""

if myString.isEmpty {
    print("String is empty.")
    return // or break, continue, throw
}

// myString is not empty (if this point is reached)
print(myString)

如果 if 语句通过,你就可以放心使用字符串,因为它不是空的。如果它为空,则函数将提前返回,并且之后的任何内容都无关紧要。

可选字符串

检查是否为 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)

这个操作会解包可选项并同时检查其是否为空。在通过guard语句后,你可以安全地使用已被解包的非空字符串。


53

在 Xcode 11.3 及之后的版本中,使用 Swift 5.2

使用

var isEmpty: Bool { get } 

例子

let lang = "Swift 5"

if lang.isEmpty {
   print("Empty string")
}

如果您想要忽略空格

if lang.trimmingCharacters(in: .whitespaces).isEmpty {
   print("Empty string")
}

2
你的答案和预期的答案有区别吗? - Ahmad F
如果用户只输入了一堆空格,这个方法就不起作用了。 - Supertecnoboff
2
在排版中,空格被视为一个字符,因此它不是空的。如果您想要的话,可以将条件更改为“lang.trimmingCharacters(in: .whitespaces).isEmpty”。 - Saranjith

31

以下是我检查字符串是否为空的方法。在这里,'blank'指的是一个字符串,它要么为空,要么只包含空格/换行符。

struct MyString {
  static func blank(text: String) -> Bool {
    let trimmed = text.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
    return trimmed.isEmpty
  }
}

使用方法:

MyString.blank(" ") // true

8
作为一个扩展,我们可以使用这个库来实现更多的功能。它提供了许多有用的工具和函数,可以帮助我们更轻松地完成任务。此外,它还具有良好的文档和社区支持,使得学习和使用它变得更加容易。如果您正在寻找一种简单而强大的方法来处理数据,那么这个库绝对值得一试。 - Daniel Gomez Rico
2
作为补充,您可能希望考虑使用 whitespaceAndNewlineCharacterSet 而不仅仅是 whitespace。 - cthulhu
1
感谢@fwielstra,忽略换行也将非常有用。 - Evgenii

21

你还可以使用可选扩展,这样你就不必担心解包或使用 == true

extension String {
    var isBlank: Bool {
        return self.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty
    }
}
extension Optional where Wrapped == String {
    var isBlank: Bool {
        if let unwrapped = self {
            return unwrapped.isBlank
        } else {
            return true
        }
    }
}
注意:当对可选项调用此函数时,请确保不要使用?,否则仍需要取消包装。

注意:当对可选项调用此函数时,请确保不要使用?,否则它仍然需要进行拆包。


1
很激动,但是没成功:( 我使用的是Swift 3.0版本。 - teradyl
当我尝试使用optionalString?isBlank时,我仍然会得到一个编译时错误,提示需要对其进行解包。 - teradyl
@teradyl,你还在那里使用?吗?你需要将其删除,否则它会尝试调用String版本而不是Optional版本 - 这就是我所说的自动完成出错的原因。 - John Montgomery
1
对我来说,currentIncident.priority?.description.isBlank 无法正常工作。提示:Value of optional type 'Bool?' not unwrapped; did you mean to use '!' or '?'?。我不得不使用 (currentIncident.priority?.description ?? "").isBlank ,这使得扩展有点无意义。Swift 4.1。 - Carsten Hagemann
1
@CarstenHagemann 这是因为priority是可选的。如果只有description是可选的,那么它可以工作,但是你不能像那样绕过一个父对象是可选的(因为如果priority是nil,那么它甚至没有一个description属性来检查首先是否为空)。 - John Montgomery
显示剩余2条评论

9

在Swift 2.0和iOS 9及以上版本中,您可以同时进行nil检查和长度检查,方法如下:

if(yourString?.characters.count > 0){}

5

如果字符串等于"",isEmpty将返回true,就像你想的那样。

其他答案指出了一种可能存在可选字符串的情况。

请使用Optional Chaining!!!

如果字符串不是nil,则使用isEmpty,否则不使用。

下面的optionalString将不会被设置,因为字符串为nil。

let optionalString: String? = nil
if optionalString?.isEmpty == true {
     optionalString = "Lorem ipsum dolor sit amet"
}

显然,您不会使用上述代码。收益来自JSON解析或其他类似情况,其中您要么有一个值,要么没有。这保证了如果有一个值,代码将被运行。

3

Swift字符串(isEmpty vs count)

你应该使用.isEmpty而不是.count

  • .isEmpty复杂度 = O(1)

  • .count复杂度 = O(n)

isEmpty在底层不使用.count,它比较开始和结束索引startIndex == endIndex

官方文档 Collection.count

复杂度:如果集合符合RandomAccessCollection,则为O(1);否则为O(n),其中n是集合的长度。

单个字符可以由多种Unicode标量值(不同的存储空间)表示,这就是为什么要计算count时我们应该迭代所有Unicode标量值的原因。

String = alex
String = \u{61}\u{6c}\u{65}\u{78}
[Char] = [a, l, e, x]

Unicode text = alex
Unicode scalar values(UTF-32) = u+00000061u+0000006cu+00000065u+00000078
1 Character == 1 extended grapheme cluster == set of Unicode scalar values

示例

//Char á == extended grapheme cluster of Unicode scalar values \u{E1}
//Char á == extended grapheme cluster of Unicode scalar values \u{61}\u{301}

let a1: String = "\u{E1}" // Unicode text = á, UTF-16 = \u00e1, UTF-32 = u+000000e1
print("count:\(a1.count)") //count:1

// Unicode text = a, UTF-16 = \u0061, UTF-32 = u+00000061
// Unicode text =  ́, UTF-16 = \u0301, UTF-32 = u+00000301
let a2: String = "\u{61}\u{301}" // Unicode text = á, UTF-16 = \u0061\u0301, UTF-32 = u+00000061u+00000301
print("count:\(a2.count)") //count:1

2

检查文本中是否只包含空格和换行符

extension String
{
    var  isBlank:Bool {
        return self.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()).isEmpty
    }
}

使用

if text.isBlank
{
  //text is blank do smth
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接