オプションの配列が空かどうかを確認する
質問
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 == nil
と
array?.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
というのは、コンパイラがラップして
0
を
Int?
である左辺と比較できるようにするためです。
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
.
関連
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] JavaScript で配列に値が含まれているかどうかを確認するにはどうすればよいですか?
-
[解決済み] 配列からArrayListを作成する
-
[解決済み] 配列に特定のインデックスで項目を挿入する方法 (JavaScript)
-
[解決済み] PHPで配列から要素を削除する
-
[解決済み] JavaScriptで配列を空にするにはどうしたらいいですか?
-
[解決済み] Objective-Cで、ある文字列が他の文字列を含んでいるかどうかを調べるにはどうすればよいですか?
-
[解決済み] SwiftでURLから画像を読み込む/ダウンロードする
-
[解決済み】オブジェクトの配列を文字列のプロパティ値でソートする
-
[解決済み】配列に何かを追加する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
XCode のコンパイル例外を解決する clang: error: linker command failed with exit code 1
-
IOSラーニングノート「このクラスはxxxのキーバリューコーディングに対応していません」問題解決
-
[解決済み] performSelectorのセレクタが不明なため、リークが発生する可能性があります。
-
[解決済み] UITableViewの選択を無効にするにはどうすればよいですか?
-
[解決済み] iOSシミュレータでスクリーンショットを撮る
-
[解決済み] UIButtonのタイトルを左揃えにするにはどうしたらよいですか?
-
[解決済み] Swift 3, 4, 5 で dispatch_after GCD を書くにはどうしたらいいですか?
-
[解決済み] iPadマルチタスクのサポートには、これらの方向が必要です。
-
[解決済み] Swiftのプロトコルでオプションのメソッドを定義するには?
-
[解決済み] iPhoneでナビゲーションバーを1ページ目だけ非表示にする