2015-04-01 181 views
77

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

我现在有这个,但似乎矫枉过正:

if stringA? != nil { 
     if !stringA!.isEmpty { 
      ...blah blah 
     } 
    } 
+1

[Unwrap String和检查相同if语句中的空白]的可能重复(http://stackoverflow.com/questions/29164670/unwrap-string-and-check-emptiness-in-the-same-if-statement ) – rintaro 2015-04-01 03:28:22

回答

8

我会推荐。

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

map应用功能参数,如果选购的是.Some
如果让可选绑定,操作系统捕获还显示新的Swift 1.2的另一种可能性。

enter image description here

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

也许你可以使用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 */ 
} 
+2

不适用于Swift 2,得到这个运行时错误'致命错误:意外地发现零,而解包可选值',但我的常量'字符串'有一个字符串数据。 – Rao 2015-10-17 09:08:48

+0

奇怪,似乎为我工作。 – 2015-10-22 17:02:44

+3

This Swift 3: 'if let string = string,!string.isEmpty {/ * string is not blank */ }' – EricS 2016-12-07 20:03:09

9
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") 
} 
+1

优雅但尴尬;),“真正的”有点抛出的intution – TruMan1 2016-05-06 16:10:38

131

如果你处理可选的字符串,这工作:

(string ?? "").isEmpty 

??无合并运算符返回左边,如果它非零,否则返回右边。

您也可以使用这样的恢复默认值:

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

如果使用的是斯威夫特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) 
} 
+0

你可以请澄清你在这里做了什么或一些资源,可以解释这一点详细。就像为什么声明了OptionalString?我没有得到语法。它不像正常的扩展实现那么。非常感谢 – 2016-11-11 18:19:37

+0

@VinayakParmar OptionalString在这里声明是因为'where Wrapped:'必须指定一个协议而不是一个类型。 – 2016-12-16 19:14:05

+0

也许你可以命名'isNilOrEmpty'为'hasValue'(或类似的东西)并且颠倒逻辑 – 2017-03-06 05:13:01

8

如果您要访问的字符串作为非可选,你应该使用Ryan's Answer,但如果你只关心字符串的非空虚,我对这个优选速记是

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

由于==工作正常使用可选的布尔值,我认为这会让代码易读而不会影响初始意图。

如果你想检查相反:如果字符串为nil"",我宁愿要检查这两种情况下明确地显示正确的意图:

if stringA == nil || stringA?.isEmpty == true { 
    ...blah blah 
} 
+0

实际上不起作用,nil永远不等于false。 – TruMan1 2016-05-06 16:08:37

+0

@ TruMan1没错,第一个例子的目标是检查字符串是否不为空。 – 2016-05-06 19:36:01

18

使用guard声明

我在我了解到guard声明之前,先使用了Swift一段时间。现在我是一个大粉丝。它与if声明类似使用,但它允许使用early return,并且通常会使代码更清晰。

要检查,以确保一个字符串既不是零,也没有空的时候用后卫,你可以做到以下几点:

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) 

这解开了可选的字符串,并检查它是不是空的一次性。如果它是零(或空),那么你立即从你的函数(或循环)返回并忽略它后面的所有内容。但是,如果警卫声明通过,那么你可以安全地使用你的解包字符串。

请参见

+0

要小心。 print(myString)不会运行,如果String是零或空的,因为防护设计进入else阶段后不会掉下来。 – 2017-02-15 02:57:24

+0

@KangByul,这是正确的,是这里逻辑的意图。假定字符串是'nil'或空,就不会想调用print(myString)。如果你需要在'nil'或空'String'之后继续执行,那么你会使用'if let'而不是'guard'。 – Suragch 2017-02-15 03:24:33

+0

谢谢你的推荐。我知道,我只是告诉其他不了解守护的人。 – 2017-02-15 05:05:24

-2

您可以使用本功能

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

不是迅速的用户;你能解释为什么这不会抛出异常,如果零通过? – Foon 2016-11-29 14:06:31

+0

它不会抛出异常,因为你根本无法将'nil'传递给这个函数(objc除外,在这种情况下它确实会崩溃)。 – Alfonso 2016-11-30 08:49:58

+0

未在param中使用nil,但直接使用字符串 – 2016-11-30 16:50:46

0

当值传递处理从本地数据库服务器,反之亦然,我对于's和!s'有什么不解之处?

因此,我做了一个Swift3.0实用程序来处理空情况,我几乎可以完全避免代码中的?和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 
    } 

这节省了我在编写合理合理的代码之后必须经历添加和删除许多?和!的麻烦。

1

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!") 
} 
0

斯威夫特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 
3

我知道有很多回答这个问题,但他们都不似乎是因为这是方便的(在我看来),以验证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 
} 
+0

最佳答案,非常感谢! – Adela 2017-12-02 17:24:31

0

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

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

stringA!力解包仅发生stringA != nil,因此它是安全的。 == false详细程度比!(stringA!.isEmpty)中的另一个感叹号更具可读性。

我个人比较喜欢形式稍有不同:

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

在上面的语句时,它立刻很清楚,当一个变量是nil整个if块不执行。