Swiftでnil
と""
の文字列をチェックする方法はありますか? Railsでは、blank()
を使用して確認できます。
私は現在これを持っていますが、やり過ぎのようです:
if stringA? != nil {
if !stringA!.isEmpty {
...blah blah
}
}
オプションの文字列を扱う場合、これは機能します:
(string ?? "").isEmpty
??
nil合体演算子は、nilでない場合は左側を返し、そうでない場合は右側を返します。
次のように使用して、デフォルト値を返すこともできます。
(string ?? "").isEmpty ? "Default" : string!
おそらく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 */
}
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
ステートメントの使用guard
ステートメントについて学ぶ前に、私はしばらくSwiftを使用していました。今、私は大ファンです。 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)
これにより、オプションの文字列のラップが解除され、一度にすべてが空でないことが確認されます。 nil(または空)の場合、関数(またはループ)からすぐに戻り、それ以降はすべて無視されます。しかし、guardステートメントがパスした場合、ラップされていない文字列を安全に使用できます。
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つである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
}
私がお勧めします。
if stringA.map(isEmpty) == false {
println("blah blah")
}
オプションが.Some
の場合、map
は関数の引数を適用します。
遊び場のキャプチャは、オプションのバインディングを許可すると、新しいSwift 1.2で別の可能性も示します。
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
ソース:
非オプションとして文字列にアクセスしたい場合は、 Ryan's Answer を使用する必要がありますが、文字列の空でないことだけを気にする場合は、このための私の省略表現は
if stringA?.isEmpty == false {
...blah blah
}
==
はオプションのブール値で正常に機能するため、元の意図を曖昧にすることなくコードを読みやすくすると思います。
逆をチェックしたい場合:文字列がnil
または""
の場合、両方のケースを明示的にチェックして正しい意図を示します:
if stringA == nil || stringA?.isEmpty == true {
...blah blah
}
Swift
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?") }
独自のカスタム関数を作成できます(それが多くのことを期待している場合)。
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ソリューションオプションのラップされていない値を使用し、ブール値に対してチェックします。
if (string?.isempty == true) {
// Perform action
}
Swift 3空の文字列をチェックする最良の方法
if !string.isEmpty{
// do stuff
}
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である可能性があるため、オプションがnilの場合に使用されるデフォルト値を指定します。
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
文字列に1つ以上の空白が含まれている場合、これはTRUEを返すことに注意してください。空の文字列を「空」として扱うには、次を使用します...
return string!.trimmingCharacters(in: CharacterSet.whitespaces).isEmpty
...代わりに。これにはFoundationが必要です。
このように使用してください...
if String.isNilOrEmpty("hello world") == true
{ print("it's a string!")
}
これは、Collection
プロトコルに準拠するすべてのタイプの一般的なソリューションであり、String
が含まれます。
extension Optional where Wrapped: Collection {
var isNilOrEmpty: Bool {
return self?.isEmpty ?? true
}
}
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
三項演算子(条件演算子C++ forever!
とも呼ばれます)を使用します。
if stringA != nil ? stringA!.isEmpty == false : false { /* ... */ }
stringA!
force-unwrappingはstringA != nil
の場合にのみ発生するため、安全です。 == false
の冗長性は、!(stringA!.isEmpty)
の別の感嘆符よりも多少読みやすいです。
私は個人的にわずかに異なる形式を好みます:
if stringA == nil ? false : stringA!.isEmpty == false { /* ... */ }
上記のステートメントでは、変数がif
の場合、nil
ブロック全体が実行されないことがすぐにわかります。
ローカルDBからサーバーへ、またはその逆に値を渡すときに、?と!で問題が多すぎます。
そのため、ヌルのケースを処理するためにSwift3.0ユーティリティを作成しましたが、コード内の?と!をほぼ完全に回避できます。
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
}
これにより、合理的に意味のあるコードを記述した後、多数の?と!を追加および削除する手間を省くことができました。
ITextFieldから値を取得し、nil
およびempty
文字列をチェックするときに役立ちます
@IBOutlet weak var myTextField: UITextField!
UITextFieldから文字列を取得し、その他の処理を行う関数(button
をタップしたとき)
@IBAction func getStringFrom_myTextField(_ sender: Any) {
guard let string = myTextField.text, !(myTextField.text?.isEmpty)! else { return }
//use "string" to do your stuff.
}
これは、nil
文字列と同様にempty
値を処理します。
それは私にとって完璧にうまくいった。