有没有办法在Swift中检查字符串nil
和""
?在Rails中,我可以使用blank()
来检查。检查字符串是否为空
我现在有这个,但似乎矫枉过正:
if stringA? != nil {
if !stringA!.isEmpty {
...blah blah
}
}
有没有办法在Swift中检查字符串nil
和""
?在Rails中,我可以使用blank()
来检查。检查字符串是否为空
我现在有这个,但似乎矫枉过正:
if stringA? != nil {
if !stringA!.isEmpty {
...blah blah
}
}
我会推荐。
if stringA.map(isEmpty) == false {
println("blah blah")
}
map
应用功能参数,如果选购的是.Some
。
如果让可选绑定,操作系统捕获还显示新的Swift 1.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")
}
也许你可以使用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 */
}
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")
}
优雅但尴尬;),“真正的”有点抛出的intution – TruMan1 2016-05-06 16:10:38
如果你处理可选的字符串,这工作:
(string ?? "").isEmpty
??
无合并运算符返回左边,如果它非零,否则返回右边。
您也可以使用这样的恢复默认值:
(string ?? "").isEmpty ? "Default" : string!
如果使用的是斯威夫特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)
}
你可以请澄清你在这里做了什么或一些资源,可以解释这一点详细。就像为什么声明了OptionalString?我没有得到语法。它不像正常的扩展实现那么。非常感谢 – 2016-11-11 18:19:37
@VinayakParmar OptionalString在这里声明是因为'where Wrapped:'必须指定一个协议而不是一个类型。 – 2016-12-16 19:14:05
也许你可以命名'isNilOrEmpty'为'hasValue'(或类似的东西)并且颠倒逻辑 – 2017-03-06 05:13:01
如果您要访问的字符串作为非可选,你应该使用Ryan's Answer,但如果你只关心字符串的非空虚,我对这个优选速记是
if stringA?.isEmpty == false {
...blah blah
}
由于==
工作正常使用可选的布尔值,我认为这会让代码易读而不会影响初始意图。
如果你想检查相反:如果字符串为nil
或""
,我宁愿要检查这两种情况下明确地显示正确的意图:
if stringA == nil || stringA?.isEmpty == true {
...blah blah
}
实际上不起作用,nil永远不等于false。 – TruMan1 2016-05-06 16:08:37
@ TruMan1没错,第一个例子的目标是检查字符串是否不为空。 – 2016-05-06 19:36:01
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)
这解开了可选的字符串,并检查它是不是空的一次性。如果它是零(或空),那么你立即从你的函数(或循环)返回并忽略它后面的所有内容。但是,如果警卫声明通过,那么你可以安全地使用你的解包字符串。
要小心。 print(myString)不会运行,如果String是零或空的,因为防护设计进入else阶段后不会掉下来。 – 2017-02-15 02:57:24
@KangByul,这是正确的,是这里逻辑的意图。假定字符串是'nil'或空,就不会想调用print(myString)。如果你需要在'nil'或空'String'之后继续执行,那么你会使用'if let'而不是'guard'。 – Suragch 2017-02-15 03:24:33
谢谢你的推荐。我知道,我只是告诉其他不了解守护的人。 – 2017-02-15 05:05:24
当值传递处理从本地数据库服务器,反之亦然,我对于'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
}
这节省了我在编写合理合理的代码之后必须经历添加和删除许多?和!的麻烦。
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!")
}
斯威夫特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
我知道有很多回答这个问题,但他们都不似乎是因为这是方便的(在我看来),以验证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
}
最佳答案,非常感谢! – Adela 2017-12-02 17:24:31
使用三元运算(也称为条件运算符,C++ forever!
):
if stringA != nil ? stringA!.isEmpty == false : false { /* ... */ }
的stringA!
力解包仅发生stringA != nil
,因此它是安全的。 == false
详细程度比!(stringA!.isEmpty)
中的另一个感叹号更具可读性。
我个人比较喜欢形式稍有不同:
if stringA == nil ? false : stringA!.isEmpty == false { /* ... */ }
在上面的语句时,它立刻很清楚,当一个变量是nil
整个if
块不执行。
[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