在 Swift 中检查空字符串?

在 Objective C 中,可以执行以下操作来检查字符串:

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

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

197157 次浏览

现在已经内置了使用 .isEmpty检测空字符串的能力:

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

苹果公司的预发布文档: “字符串”

下面是检查字符串是否为空的方法。我所说的“空白”是指一个字符串,它要么是空的,要么只包含空格/换行符。

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

使用方法:

MyString.blank(" ") // true

我完全重写了我的答案(再来一次)。这次是因为我已经成为了 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语句通过,那么您可以安全地使用该字符串,因为您知道它不是空的。如果它是空的,那么函数将提前返回,并且在它重要之后什么也不返回。

可选字符串

检查长度是零还是零。

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语句之后,可以安全地使用取消包装的非空字符串。

检查字符串是空还是空的一种简明方法是:

var myString: String? = nil


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

同时进行零检查和长度检查 你可以使用 Swift 2.0和 iOS 9以上版本

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

对于可选字符串,如何选择:

if let string = string where !string.isEmpty
{
print(string)
}

关于什么

if let notEmptyString = optionalString where !notEmptyString.isEmpty {
// do something with emptyString
NSLog("Non-empty string is %@", notEmptyString)
} else {
// empty or nil string
NSLog("Empty or nil string")
}

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

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

使用

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

IsEmpty 将按照您的想法执行,如果 string = = “”,它将返回 true。 其他一些答案指向一种情况,即您有一个可选的字符串。

请使用 可选链接

如果字符串不为空,则将使用 isEmpty,否则将不使用它。

下面,将不设置 optionalString,因为该字符串为 nil

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

显然你不会使用上面的代码。这些收益来自于 JSON 解析或其他类似的情况,在这些情况下,您或者拥有值,或者没有值。这保证了如果存在一个值,代码将会运行。

你也可以使用一个可选的扩展,这样你就不用担心打开或者使用 == 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
}
}
}

注意: 在可选项上调用这个函数时,请确保不要使用 ?,否则它仍然需要展开。

在 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")
}
if myString?.startIndex != myString?.endIndex {}

我可以建议向 String 或 Array 添加小的扩展名,它们看起来像

extension Collection {
public var isNotEmpty: Bool {
return !self.isEmpty
}
}

有了它,您可以编写更容易阅读的代码。 比较这两行

if !someObject.someParam.someSubParam.someString.isEmpty {}

还有

if someObject.someParam.someSubParam.someString.isNotEmpty {}

在拳头行的开头很容易漏掉 标志。

您可以使用这个扩展:

extension String {


static func isNilOrEmpty(string: String?) -> Bool {
guard let value = string else { return true }


return value.trimmingCharacters(in: .whitespaces).isEmpty
}


}

然后像这样使用它:

let isMyStringEmptyOrNil = String.isNilOrEmpty(string: myString)
public extension Swift.Optional {
    

func nonEmptyValue<T>(fallback: T) -> T {
        

if let stringValue = self as? String, stringValue.isEmpty {
return fallback
}
        

if let value = self as? T {
return value
} else {
return fallback
}
}
}

Swift String (isEmpty vs count)

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

  • 复杂度 = O (1)

  • 复杂度 = O (n)

isEmpty没有在引擎盖下使用 .count,它比较起始和结束索引 startIndex == endIndex

官方文件收集

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

单个 character可以由 Unicode scalar values(不同的内存占用)的许多组合来表示,这就是为什么要计算 计数,我们应该迭代所有 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