文字列のnilと空をチェック


134

以下のための文字列をチェックする方法があるnil""スウィフトでは?Railsでは、blank()チェックに使用できます。

私は現在これを持っていますが、やりすぎのようです:

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

1
Unwrap

1
(@sutraと@ imanou-petit)の回答の方が優れています。
Ming氏

回答:


211

オプションの文字列を扱っている場合、これは機能します。

(string ?? "").isEmpty

??それがnil以外だ場合はnil合体演算子は、それ以外の場合は右側を返し、左側を返します。

次のように使用して、デフォルト値を返すこともできます。

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

3
エレガント??? 。あなたは基本的に文字列がnil他に空の文字列ではないし、その呼び出しは何の論理的声明...その上で空の場合、」書いた
Renetik

73

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では機能しません。このランタイムエラーfatal error: unexpectedly found nil while unwrapping an Optional valueが発生しますが、定数stringには文字列データがあります。
Nagendra Rao

3
これはSwift 3で機能しますif let string = string, !string.isEmpty { /* string is not blank */ }
EricS

1
@AmrLotfy guard letは、ステートメントの下の制御フローを終了する場合の代替手段です。ただし、ここのwhere句では何もラップされていません(!はブール否定です)
Ryan

では、この!str?.isEmptyの代わりに、string = stringの代わりに!string.isEmpty
Pankaj

28

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

ここで何をしたか、またはこれを詳細に説明できるリソースを明確にしていただけませんか。なぜOptionalStringが宣言されているのですか?構文がわかりません。それは通常の拡張機能の実装とは異なります。どうもありがとうございました
Vinayak Parmar

where Wrapped:はタイプではなくプロトコルを指定する必要があるため、ここでは@VinayakParmar OptionalStringが宣言されています。
アダムジョンズ

多分あなたは名前isNilOrEmptyを付けるhasValueか(またはそのようなもの)、論理を逆にすることができます
Islam Q.

28

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ステートメントがパスすれば、ラップされていない文字列を安全に使用できます。

こちらもご覧ください


注意してください。文字列がnilまたは空の場合、print(myString)は実行されません。これは、ガードがelseフェーズに入った後に落下しないように設計されているためです。
Kang Byul 2017

@KangByul、それは正しい、そしてここでのロジックの意図です。おそらく文字列がnil空の場合、を呼び出したくないでしょうprint(myString)nilまたは空の後で実行を継続する必要Stringがある場合if letは、ではなくを使用しますguard
Suragch、2017

表彰してくれてありがとう。私は知っている、私はガードについてあまり知らない他の人たちに話します。
Kang Byul 2017

4
@KangByul「注意してください」コメントの意味がわかりません。すばらしい解決策から人々を怖がらせていると思います。returnステートメントはguard elseステートメントで明らかに正しいです。コメントは削除してください
ブライアンオグデン

16

Swift 5では、オプションの文字列に値がないか空の場合に返されるブール型プロパティを使用して、typeのOptional拡張機能を実装できStringます。

extension Optional where Wrapped == String {

    var isNilOrEmpty: Bool {
        return self?.isEmpty ?? true
    }

}

ただし、プロトコルに準拠してプロパティをString実装isEmptyしますCollection。そこで我々は、前のコードの一般的な制約を(置き換えることができWrapped == String、より広い1(と)Wrapped: Collection)となるようArrayDictionaryそしてSetまた私たちの新しいメリットisNilOrEmptyプロパティを:

extension Optional where Wrapped: Collection {

    var isNilOrEmpty: Bool {
        return self?.isEmpty ?? true
    }

}

Strings での使用:

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

Arrays での使用:

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

出典:


1
私はこれが好きです、私が行う唯一の微調整は、プレフィックスに一致するようにからisNilOrEmptyに名前を変更することisEmptyOrNilです。これにより、オートコンプリートの同じパターンを介して簡単に見つけることができます。私が一緒に仕事をしている同僚がこの方法でそれを見つけただけで、この拡張機能の採用が増えることに気づきました。
アーロン

14
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
エレガントですがぎこちない;)、「本当の」ちょっとした直観を捨てる
TruMan1

9

この質問にはたくさんの答えがあることはわかっていますが、UITextFieldデータを検証するのにこれほど便利ではないようです(私の意見では)。これは、データを使用する最も一般的なケースの1つです。

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
}

公共の延長オプション包ま==文字列:ので、ここでは空白としてカウント空白が私のバージョンであればグレート答え、オペアンプは正確ではありませんでした{VAR isEmptyOrNil:ブール{リターン(自己??「」).isEmpty}}
sachadso

7

私がお勧めします。

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

mapオプションがの場合、関数の引数を適用します.Some
遊び場のキャプチャは、オプションのバインディングを使用すると、新しいSwift 1.2で別の可能性も示します。

ここに画像の説明を入力してください


7

非オプションとして文字列にアクセスする場合は、Ryan's Answerを使用する必要がありますが、文字列が空でないことのみを気にする場合は、これを優先する省略表現は

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

以来==、オプションのブール値を持つ作品の罰金、私は本来の意図を不明瞭にすることなく、この葉にコードの読みやすいと思います。

反対を確認したい場合:文字列がnilまたはの場合""、両方のケースを明示的に確認して、正しい意図を示します。

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

@ TruMan1正解です。最初の例の目的は、文字列が空でないかどうかを確認することです。
Alex Pretzlav、2016年

4

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

4

Swift 3チェック用の空の文字列の最良の方法

if !string.isEmpty{

// do stuff

}

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

2

Swift 3ソリューションオプションのラップされていない値を使用して、ブール値と照合します。

if (string?.isempty == true) {
    // Perform action
}

2

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

リファレンス:https : //useyourloaf.com/blog/empty-strings-in-swift/


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

文字列に1つ以上の空白が含まれている場合、これはTRUEを返すことに注意してください。空の文字列を「空」として扱うには、次を使用します...

return string!.trimmingCharacters(in: CharacterSet.whitespaces).isEmpty

...代わりに。これには財団が必要です。

このように使用してください...

if String.isNilOrEmpty("hello world") == true 
{   print("it's a string!")
}

1

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

1

あなたはこのようなことをするべきです:
if !(string?.isEmpty ?? true) { //Not nil nor empty }

Nilの合体演算子は、オプションがnilでないかどうかをチェックします。nilでない場合は、プロパティをチェックします。この場合はisEmptyです。このオプションはnilになる可能性があるため、オプションがnilの場合に使用されるデフォルト値を指定します。


1

これは、Collectionプロトコルに準拠するすべてのタイプの一般的なソリューションですString

extension Optional where Wrapped: Collection {
    var isNilOrEmpty: Bool {
        self?.isEmpty ?? true
    }
}

0

ローカルdbからサーバーへ、またはその逆の値の受け渡しを処理するときに、?と!と、そうでないことで問題が多すぎました。

したがって、nullのケースを処理する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
    }

これにより、合理的に意味のあるコードを記述した後に、多数の?と!を追加したり削除したりする手間を省くことができました。


0

三項演算子(条件演算子とも呼ばれますC++ forever!)を使用します。

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

stringA!ときにのみ力アンラップが起こるstringA != nilので、それが安全です、。== false冗長性は、さらに別の感嘆符に比べてやや読みやすいです!(stringA!.isEmpty)

私は個人的には少し異なるフォームを好みます:

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

上記のステートメントではif、変数がの場合、ブロック全体が実行されないことがすぐにわかりますnil


0

UITextFieldから値を取得し 、nilempty文字列をチェックするときに役立ちます

@IBOutlet weak var myTextField: UITextField!

buttonUITextFieldから文字列を取得し、その他の処理を行う関数(をタップしたとき)

@IBAction func getStringFrom_myTextField(_ sender: Any) {

guard let string = myTextField.text, !(myTextField.text?.isEmpty)!  else { return }
    //use "string" to do your stuff.
}

これによりnilempty文字列だけでなく値も処理されます。

それは私にとって完全にうまくいった。


0

私の意見では、nilと空の文字列を確認する最良の方法は、文字列のカウントを取得することです。

var nilString : String?
print(nilString.count) // count is nil

var emptyString = ""
print(emptyString.count) // count is 0

// combine both conditions for optional string variable
if string?.count == nil || string?.count == 0 {
   print("Your string is either empty or nil")
}

-4

あなたはこの機能を使うことができます

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

2
迅速なユーザーではありません。nilが渡された場合に例外がスローされない理由を説明できますか?
2016年

nilこの関数に渡すことができないため、例外はスローされません(objcからは例外です。objcの場合、実際にはクラッシュします)。
Alfonso

これは質問の答えにはなりません。オプションを受け入れないため、nilをチェックしません
ウェインエラリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.