有没有办法在Swift中检查nil
和""
的字符串?在Rails中,我可以使用blank()
来检查。
我目前有这个,但它似乎有点矫枉过正:
if stringA? != nil {
if !stringA!.isEmpty {
...blah blah
}
}
如果您正在处理可选字符串,则可以:
(string ?? "").isEmpty
??
nil合并算子返回左侧,如果它是非零,否则它返回右侧。
您也可以像这样使用它来返回默认值:
(string ?? "").isEmpty ? "Default" : string!
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?") }
Swift 3用于检查空字符串的最佳方式
if !string.isEmpty{
// do stuff
}
您可以创建自己的自定义函数,如果这是您希望做的很多事情。
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")
}
Swift 3解决方案使用可选的unwrapped值并检查布尔值。
if (string?.isempty == true) {
// Perform action
}
创建一个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!")
}
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
你应该做这样的事情:
if !(string?.isEmpty ?? true) { //Not nil nor empty }
Nil合并运算符检查可选项是否为nil,如果它不是nil,则检查其属性,在本例中为isEmpty。因为此可选项可以为nil,所以您提供了一个默认值,当您的optional是nil时将使用该值。
在处理从本地数据库到服务器的值传递时,反之亦然,我在使用?和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'的麻烦。
使用三元运算符(也称为条件运算符,C++ forever!
):
if stringA != nil ? stringA!.isEmpty == false : false { /* ... */ }
stringA!
力量展开只发生在stringA != nil
,所以它是安全的。 == false
详细程度比!(stringA!.isEmpty)
中的另一个感叹号更具可读性。
我个人更喜欢略有不同的形式:
if stringA == nil ? false : stringA!.isEmpty == false { /* ... */ }
在上面的语句中,很明显当变量是if
时,整个nil
块不会执行。
从UITextField获取值并检查nil
和empty
字符串时很有帮助
@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
字符串。
它对我来说非常好用。
您也许可以使用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 */
}
使用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
你可以使用这个功能
class func stringIsNilOrEmpty(aString: String) -> Bool { return (aString).isEmpty }
如果您使用的是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)
}
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(或为空),则立即从函数(或循环)返回,并忽略其后的所有内容。但是如果守护声明通过,那么你可以安全地使用你的解包字符串。
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")
}
我知道这个问题有很多答案,但是它们(我认为)中没有一个像验证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
}
使用Swift 5,您可以为Optional
类型实现String
扩展,其布尔属性在可选字符串没有值或为空时返回:
extension Optional where Wrapped == String {
var isNilOrEmpty: Bool {
return self?.isEmpty ?? true
}
}
然而,String
通过符合协议isEmpty
实现Collection
财产。因此,我们可以用更宽的一个(Wrapped == String
)替换先前代码的通用约束(Wrapped: Collection
),以便Array
,Dictionary
和Set
也有益于我们新的isNilOrEmpty
属性:
extension Optional where Wrapped: Collection {
var isNilOrEmpty: Bool {
return self?.isEmpty ?? true
}
}
用于String
s:
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
用于Array
s:
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
资料来源:
我会推荐。
if stringA.map(isEmpty) == false {
println("blah blah")
}
如果可选项是map
,则.Some
应用函数参数。
如果让可选的绑定,操场捕获还显示了新Swift 1.2的另一种可能性。
如果你想以非可选方式访问字符串,你应该使用Ryan's Answer,但如果你只关心字符串的非空虚,我的首选简写是
if stringA?.isEmpty == false {
...blah blah
}
由于==
在可选的布尔值下运行良好,我认为这使得代码可读而不会模糊原始意图。
如果你想检查相反的结果:如果字符串是nil
或""
,我更愿意明确检查这两种情况以显示正确的意图:
if stringA == nil || stringA?.isEmpty == true {
...blah blah
}