1. ホーム
  2. ios

オプションの配列が空かどうかを確認する

2023-11-05 06:40:34

質問

Objective-Cで、配列がある場合

NSArray *array;

で、それが空でないかどうかをチェックしたいのですが、私はいつもそうしています。

if (array.count > 0) {
    NSLog(@"There are objects!");
} else {
    NSLog(@"There are no objects...");
}

こうすれば array == nil に陥ってしまうので、チェックする必要はありません。 else のケースと同様に、非 nil でなく、空の配列でもかまいません。

しかし、Swiftでは、オプションの配列を持っている状況に出くわしました。

var array: [Int]?

で、どの条件を使えばいいのかがわかりません。私はいくつかのオプションを持っている、次のように。

オプションA。 nil と空の場合の両方を同じ条件でチェックします。

if array != nil && array!.count > 0 {
    println("There are objects")
} else {
    println("No objects")
}

オプションBです。 配列のバインドを解除するには let :

if let unbindArray = array {
    if (unbindArray.count > 0) {
        println("There are objects!")
    } else {
        println("There are no objects...")
    }
} else {
    println("There are no objects...")
}

オプションCです。 Swiftが提供する合体演算子を使用する。

if (array?.count ?? 0) > 0 {
    println("There are objects")
} else {
    println("No objects")
}

私はこのオプションが好きではありません。 B はあまり好きではありません。なぜなら、私は2つの条件でコードを繰り返しているからです。しかし、私はオプション A C は正しいのでしょうか、それとも他の方法を使うべきなのでしょうか。

状況によってはオプション配列の使用を避けることができるのは知っていますが、場合によっては空かどうかを尋ねる必要があるかもしれません。そこで、一番簡単な方法を教えていただきたいです。


EDITです。

vacawamaさんのご指摘の通り、この簡単な方法で確認ができました。

if array?.count > 0 {
    println("There are objects")
} else {
    println("No objects")
}

のときだけ特別なことをしたい、というケースを試していました。 nil または空のときだけ特別な処理を行い、配列に要素があるかどうかに関係なく処理を続けたいというケースを試していました。そこで、試してみました。

if array?.count == 0 {
    println("There are no objects")
}

// Do something regardless whether the array has elements or not.

また

if array?.isEmpty == true {
    println("There are no objects")
}

// Do something regardless whether the array has elements or not.

しかし、配列が nil には該当しません。 if のボディになります。というのも、その場合 array?.count == nilarray?.isEmpty == nil という表現になるので array?.count == 0 となり array?.isEmpty == true はどちらも false .

そこで、これを1つの条件だけでも実現する方法はないかと考えています。

どのように解決するのですか?

Swift 3 以降のバージョンについて、回答を更新しました。

Swift 3では、オプションの比較機能を削除し >< であるため、前の答えの一部はもはや有効ではありません。

オプションの比較はまだ可能です。 == であるため、オプショナル配列に値が含まれているかどうかを確認する最も簡単な方法です。

if array?.isEmpty == false {
    print("There are objects!")
}

他の方法も可能です。

if array?.count ?? 0 > 0 {
    print("There are objects!")
}

if !(array?.isEmpty ?? true) {
    print("There are objects!")
}

if array != nil && !array!.isEmpty {
    print("There are objects!")
}

if array != nil && array!.count > 0 {
    print("There are objects!")
}

if !(array ?? []).isEmpty {
    print("There are objects!")
}

if (array ?? []).count > 0 {
    print("There are objects!")
}

if let array = array, array.count > 0 {
    print("There are objects!")
}

if let array = array, !array.isEmpty {
    print("There are objects!")
}


配列が nil または空のとき、少なくとも6つの選択肢があります。

選択肢A。

if !(array?.isEmpty == false) {
    print("There are no objects")
}

オプションBです。

if array == nil || array!.count == 0 {
    print("There are no objects")
}

オプションCです。

if array == nil || array!.isEmpty {
    print("There are no objects")
}

選択肢D

if (array ?? []).isEmpty {
    print("There are no objects")
}

オプションEです。

if array?.isEmpty ?? true {
    print("There are no objects")
}

オプションFです。

if (array?.count ?? 0) == 0 {
    print("There are no objects")
}

オプションC は、あなたが英語で説明したことをそのまま表しています。 nilまたはemptyのときだけ特別なことをしたい。 わかりやすいので、これを使うことをお勧めします。 特に問題はないのですが、もし変数が nil .



Swift 2.x に対する前回の回答です。

単にすることができます。

if array?.count > 0 {
    print("There are objects")
} else {
    print("No objects")
}

コメントで @Martin が指摘しているように、これは func ><T : _Comparable>(lhs: T?, rhs: T?) -> Bool というのは、コンパイラがラップして 0Int? である左辺と比較できるようにするためです。 Int? である左辺と比較できるようになります。

同じような方法で、あなたは

if array?.isEmpty == false {
    print("There are objects")
} else {
    print("No objects")
}

注意:明示的に比較する必要があります。 false で比較する必要があります。


もし、配列が nil または空のとき、少なくとも7つの選択肢があります。

選択肢A。

if !(array?.count > 0) {
    print("There are no objects")
}

オプションBです。

if !(array?.isEmpty == false) {
    print("There are no objects")
}

オプションCです。

if array == nil || array!.count == 0 {
    print("There are no objects")
}

選択肢D

if array == nil || array!.isEmpty {
    print("There are no objects")
}

オプションEです。

if (array ?? []).isEmpty {
    print("There are no objects")
}

オプションFです。

if array?.isEmpty ?? true {
    print("There are no objects")
}

オプションGです。

if (array?.count ?? 0) == 0 {
    print("There are no objects")
}

オプションD は、あなたが英語で説明したことをそのまま表しています。 nilまたはemptyのときだけ特別なことをしたい。 わかりやすいので、これを使うことをお勧めします。 特に問題はないのですが、もし変数が nil .