在Objective C中,可以使用以下方法检查字符串:
if ([myString isEqualToString:@""]) {
NSLog(@"myString IS empty!");
} else {
NSLog(@"myString IS NOT empty, it is: %@", myString);
}
如何在Swift中检测空字符串?
在Objective C中,可以使用以下方法检查字符串:
if ([myString isEqualToString:@""]) {
NSLog(@"myString IS empty!");
} else {
NSLog(@"myString IS NOT empty, it is: %@", myString);
}
如何在Swift中检测空字符串?
现在有内置的能力可以使用.isEmpty
来检测空字符串:
if emptyString.isEmpty {
print("Nothing to see here")
}
Apple的预发布文档:"字符串和字符"。
检查字符串是否为nil或空的简洁方法是:
var myString: String? = nil
if (myString ?? "").isEmpty {
print("String is nil or empty")
}
if let myString = myString where !myString.isEmpty { ... }
,这样会检查字符串是否为非空。 - Albert Bori我正在完全重写我的回答(再次)。这一次是因为我成为了 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
语句后,你可以安全地使用已被解包的非空字符串。
使用
var isEmpty: Bool { get }
例子
let lang = "Swift 5"
if lang.isEmpty {
print("Empty string")
}
如果您想要忽略空格
if lang.trimmingCharacters(in: .whitespaces).isEmpty {
print("Empty string")
}
以下是我检查字符串是否为空的方法。在这里,'blank'指的是一个字符串,它要么为空,要么只包含空格/换行符。
struct MyString {
static func blank(text: String) -> Bool {
let trimmed = text.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
return trimmed.isEmpty
}
}
使用方法:
MyString.blank(" ") // true
你还可以使用可选扩展,这样你就不必担心解包或使用 == 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
}
}
}
注意:当对可选项调用此函数时,请确保不要使用?
,否则仍需要取消包装。
注意:当对可选项调用此函数时,请确保不要使用?
,否则它仍然需要进行拆包。
optionalString?isBlank
时,我仍然会得到一个编译时错误,提示需要对其进行解包。 - teradyl?
吗?你需要将其删除,否则它会尝试调用String
版本而不是Optional
版本 - 这就是我所说的自动完成出错的原因。 - John MontgomerycurrentIncident.priority?.description.isBlank
无法正常工作。提示:Value of optional type 'Bool?' not unwrapped; did you mean to use '!' or '?'?
。我不得不使用 (currentIncident.priority?.description ?? "").isBlank
,这使得扩展有点无意义。Swift 4.1。 - Carsten Hagemannpriority
是可选的。如果只有description
是可选的,那么它可以工作,但是你不能像那样绕过一个父对象是可选的(因为如果priority
是nil,那么它甚至没有一个description
属性来检查首先是否为空)。 - John Montgomery在Swift 2.0和iOS 9及以上版本中,您可以同时进行nil检查和长度检查,方法如下:
if(yourString?.characters.count > 0){}
如果字符串等于"",isEmpty将返回true,就像你想的那样。
其他答案指出了一种可能存在可选字符串的情况。
请使用Optional Chaining!!!
如果字符串不是nil,则使用isEmpty,否则不使用。
下面的optionalString将不会被设置,因为字符串为nil。
let optionalString: String? = nil
if optionalString?.isEmpty == true {
optionalString = "Lorem ipsum dolor sit amet"
}
Swift字符串(isEmpty vs count)
你应该使用.isEmpty
而不是.count
.isEmpty
复杂度 = O(1)
.count
复杂度 = O(n)
isEmpty
在底层不使用.count
,它比较开始和结束索引startIndex == endIndex
复杂度:如果集合符合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
检查文本中是否只包含空格和换行符
extension String
{
var isBlank:Bool {
return self.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()).isEmpty
}
}
使用
if text.isBlank
{
//text is blank do smth
}