Swift: Testing optionals for nil

前端 未结 14 615
攒了一身酷
攒了一身酷 2020-12-08 08:51

I\'m using Xcode 6 Beta 4. I have this weird situation where I cannot figure out how to appropriately test for optionals.

If I have an optional xyz, is the correct w

相关标签:
14条回答
  • 2020-12-08 09:16

    In Xcode Beta 5, they no longer let you do:

    var xyz : NSString?
    
    if xyz {
      // Do something using `xyz`.
    }
    

    This produces an error:

    does not conform to protocol 'BooleanType.Protocol'

    You have to use one of these forms:

    if xyz != nil {
       // Do something using `xyz`.
    }
    
    if let xy = xyz {
       // Do something using `xy`.
    }
    
    0 讨论(0)
  • 2020-12-08 09:17

    Swift 3.0, 4.0

    There are mainly two ways of checking optional for nil. Here are examples with comparison between them

    1. if let

    if let is the most basic way to check optional for nil. Other conditions can be appended to this nil check, separated by comma. The variable must not be nil to move for the next condition. If only nil check is required, remove extra conditions in the following code.

    Other than that, if x is not nil, the if closure will be executed and x_val will be available inside. Otherwise the else closure is triggered.

    if let x_val = x, x_val > 5 {
        //x_val available on this scope
    } else {
    
    }
    

    2. guard let

    guard let can do similar things. It's main purpose is to make it logically more reasonable. It's like saying Make sure the variable is not nil, otherwise stop the function. guard let can also do extra condition checking as if let.

    The differences are that the unwrapped value will be available on same scope as guard let, as shown in the comment below. This also leads to the point that in else closure, the program has to exit the current scope, by return, break, etc.

    guard let x_val = x, x_val > 5 else {
        return
    }
    //x_val available on this scope
    
    0 讨论(0)
  • 2020-12-08 09:20

    Swift 5 Protocol Extension

    Here is an approach using protocol extension so that you can easily inline an optional nil check:

    import Foundation
    
    public extension Optional {
    
        var isNil: Bool {
    
            guard case Optional.none = self else {
                return false
            }
    
            return true
    
        }
    
        var isSome: Bool {
    
            return !self.isNil
    
        }
    
    }
    

    Usage

    var myValue: String?
    
    if myValue.isNil {
        // do something
    }
    
    if myValue.isSome {
        // do something
    }
    
    0 讨论(0)
  • 2020-12-08 09:20

    One option that hasn't specifically been covered is using Swift's ignored value syntax:

    if let _ = xyz {
        // something that should only happen if xyz is not nil
    }
    

    I like this since checking for nil feels out of place in a modern language like Swift. I think the reason it feels out of place is that nil is basically a sentinel value. We've done away with sentinels pretty much everywhere else in modern programming so nil feels like it should go too.

    0 讨论(0)
  • 2020-12-08 09:21

    From swift programming guide

    If Statements and Forced Unwrapping

    You can use an if statement to find out whether an optional contains a value. If an optional does have a value, it evaluates to true; if it has no value at all, it evaluates to false.

    So the best way to do this is

    // swift > 3
    if xyz != nil {}
    

    and if you are using the xyz in if statement.Than you can unwrap xyz in if statement in constant variable .So you do not need to unwrap every place in if statement where xyz is used.

    if let yourConstant = xyz{
          //use youtConstant you do not need to unwrap `xyz`
    }
    

    This convention is suggested by apple and it will be followed by devlopers.

    0 讨论(0)
  • 2020-12-08 09:21

    Now you can do in swift the following thing which allows you to regain a little bit of the objective-c if nil else

    if textfieldDate.text?.isEmpty ?? true {
    
    }
    
    0 讨论(0)
提交回复
热议问题