Check if optional array is empty

后端 未结 7 2213
感情败类
感情败类 2020-11-29 18:21

In Objective-C, when I have an array

NSArray *array;

and I want to check if it is not empty, I always do:

if (array.count &         


        
相关标签:
7条回答
  • 2020-11-29 18:43

    Option D: If the array doesn't need to be optional, because you only really care if it's empty or not, initialise it as an empty array instead of an optional:

    var array = [Int]()
    

    Now it will always exist, and you can simply check for isEmpty.

    0 讨论(0)
  • 2020-11-29 18:44

    Conditional unwrapping:

    if let anArray = array {
        if !anArray.isEmpty {
            //do something
        }
    }
    

    EDIT: Possible since Swift 1.2:

    if let myArray = array where !myArray.isEmpty {
        // do something with non empty 'myArray'
    }
    

    EDIT: Possible since Swift 2.0:

    guard let myArray = array where !myArray.isEmpty else {
        return
    }
    // do something with non empty 'myArray'
    
    0 讨论(0)
  • 2020-11-29 18:51

    Updated answer for Swift 3 and above:

    Swift 3 has removed the ability to compare optionals with > and <, so some parts of the previous answer are no longer valid.

    It is still possible to compare optionals with ==, so the most straightforward way to check if an optional array contains values is:

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

    Other ways it can be done:

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

    If you want to do something when the array is nil or is empty, you have at least 6 choices:

    Option A:

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

    Option B:

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

    Option C:

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

    Option D:

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

    Option E:

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

    Option F:

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

    Option C exactly captures how you described it in English: "I want to do something special only when it is nil or empty." I would recommend that you use this since it is easy to understand. There is nothing wrong with this, especially since it will "short circuit" and skip the check for empty if the variable is nil.



    Previous answer for Swift 2.x:

    You can simply do:

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

    As @Martin points out in the comments, it uses func ><T : _Comparable>(lhs: T?, rhs: T?) -> Bool which means that the compiler wraps 0 as an Int? so that the comparison can be made with the left hand side which is an Int? because of the optional chaining call.

    In a similar way, you could do:

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

    Note: You have to explicitly compare with false here for this to work.


    If you want to do something when the array is nil or is empty, you have at least 7 choices:

    Option A:

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

    Option B:

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

    Option C:

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

    Option D:

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

    Option E:

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

    Option F:

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

    Option G:

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

    Option D exactly captures how you described it in English: "I want to do something special only when it is nil or empty." I would recommend that you use this since it is easy to understand. There is nothing wrong with this, especially since it will "short circuit" and skip the check for empty if the variable is nil.

    0 讨论(0)
  • 2020-11-29 18:56

    Instead of using if and else it is better way just to use guard to check for empty array without creating new variables for the same array.

    guard !array.isEmpty else {
        return
    }
    // do something with non empty ‘array’
    
    0 讨论(0)
  • 2020-11-29 18:58

    The elegant built-in solution is Optional's map method. This method is often forgotten, but it does exactly what you need here; it allows you to send a message to the thing wrapped inside an Optional, safely. We end up in this case with a kind of threeway switch: we can say isEmpty to the Optional array, and get true, false, or nil (in case the array is itself nil).

    var array : [Int]?
    array.map {$0.isEmpty} // nil (because `array` is nil)
    array = []
    array.map {$0.isEmpty} // true (wrapped in an Optional)
    array?.append(1)
    array.map {$0.isEmpty} // false (wrapped in an Optional)
    
    0 讨论(0)
  • 2020-11-29 19:04

    Extension Property on the Collection Protocol

    *Written in Swift 3

    extension Optional where Wrapped: Collection {
        var isNilOrEmpty: Bool {
            switch self {
                case .some(let collection):
                    return collection.isEmpty
                case .none:
                    return true
            }
        }
    }
    

    Example Use:

    if array.isNilOrEmpty {
        print("The array is nil or empty")
    }
    

     

    Other Options

    Other than the extension above, I find the following option most clear without force unwrapping optionals. I read this as unwrapping the optional array and if nil, substituting an empty array of the same type. Then, taking the (non-optional) result of that and if it isEmpty execute the conditional code.

    Recommended

    if (array ?? []).isEmpty {
        print("The array is nil or empty")
    }
    

    Though the following reads clearly, I suggest a habit of avoiding force unwrapping optionals whenever possible. Though you are guaranteed that array will never be nil when array!.isEmpty is executed in this specific case, it would be easy to edit it later and inadvertently introduce a crash. When you become comfortable force unwrapping optionals, you increase the chance that someone will make a change in the future that compiles but crashes at runtime.

    Not Recommended!

    if array == nil || array!.isEmpty {
        print("The array is nil or empty")
    }
    

    I find options that include array? (optional chaining) confusing such as:

    Confusing?

    if !(array?.isEmpty == false) {
        print("The array is nil or empty")
    }
    
    if array?.isEmpty ?? true {
        print("There are no objects")
    }
    
    0 讨论(0)
提交回复
热议问题