web-dev-qa-db-ja.com

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

Swiftでnil""の文字列をチェックする方法はありますか? Railsでは、blank()を使用して確認できます。

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

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

オプションの文字列を扱う場合、これは機能します:

(string ?? "").isEmpty

?? nil合体演算子は、nilでない場合は左側を返し、そうでない場合は右側を返します。

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

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

おそらく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 */
}
72
Ryan

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)
}
24
Ken Ko

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

こちらもご覧ください

23
Suragch
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")
}
12
Sutra

この質問には多くの答えがあることは知っていますが、それを使用するための最も一般的なケースの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
}
9
Sir Codesalot

私がお勧めします。

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

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

enter image description here

7
Price Ringo

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

extension Optional where Wrapped == String {

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

}

ただし、Stringは、プロトコルisEmptyに準拠することでCollectionプロパティを実装します。したがって、以前のコードの汎用制約(Wrapped == String)をより広い制約(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

ソース:

7
Imanou Petit

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

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

==はオプションのブール値で正常に機能するため、元の意図を曖昧にすることなくコードを読みやすくすると思います。

逆をチェックしたい場合:文字列がnilまたは""の場合、両方のケースを明示的にチェックして正しい意図を示します:

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

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

独自のカスタム関数を作成できます(それが多くのことを期待している場合)。

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
vol7ron

Swift 3ソリューションオプションのラップされていない値を使用し、ブール値に対してチェックします。

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

Swift 3空の文字列をチェックする最良の方法

if !string.isEmpty{

// do stuff

}
2
Anas

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
FredFlinstone

次のようにする必要があります。
if !(string?.isEmpty ?? true) { //Not nil nor empty }

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

1
Dominik Babić

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

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

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

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/

0
raaz

三項演算子(条件演算子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ブロック全体が実行されないことがすぐにわかります。

0
Gary

ローカル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
    }

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

0
Nikhil Mathew

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値を処理します。

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

0
Soropromo