When should I compare an optional value to nil?

前端 未结 5 1537
时光取名叫无心
时光取名叫无心 2020-11-22 10:22

Quite often, you need to write code such as the following:

if someOptional != nil {
    // do something with the unwrapped someOptional e.g.       
    someF         


        
5条回答
  •  旧时难觅i
    2020-11-22 11:22

    After lot of thinking and researching i have came up with the easiest way to unwrap an optional :

    • Create a new Swift File and name it UnwrapOperator.swift

    • Paste the following code in the file :

      import Foundation
      import UIKit
      
      protocol OptionalType { init() }
      
      extension String: OptionalType {}
      extension Int: OptionalType {}
      extension Int64: OptionalType {}
      extension Float: OptionalType {}
      extension Double: OptionalType {}
      extension CGFloat: OptionalType {}
      extension Bool: OptionalType {}
      extension UIImage : OptionalType {}
      extension IndexPath : OptionalType {}
      extension NSNumber : OptionalType {}
      extension Date : OptionalType {}
      extension UIViewController : OptionalType {}
      
      postfix operator *?
      postfix func *?( lhs: T?) -> T {
      
          guard let validLhs = lhs else { return T() }
          return validLhs
      }
      
      prefix operator /
      prefix func /( rhs: T?) -> T {
      
          guard let validRhs = rhs else { return T() }
          return validRhs
      }
      
    • Now the above code has created 2 operator [One prefix and one postfix].

    • At the time of unwrapping you can use either of these operator before or after the optionals
    • The explanation is simple, the operators returns the constructor value if they get nil in variable else the contained value inside the variable.

    • Below is the example of usage :

      var a_optional : String? = "abc"
      var b_optional : Int? = 123
      
      // before the usage of Operators
      
      print(a_optional) --> Optional("abc")
      print(b_optional) --> Optional(123)
      
      // Prefix Operator Usage
      
      print(/a_optional) --> "abc"
      print(/b_optional) --> 123
      
      // Postfix Operator Usage
      
      print(a_optional*?) --> "abc"
      print(b_optional*?) --> 123
      
    • Below is the example when variable contains nil :

      var a_optional : String? = nil
      var b_optional : Int? = nil
      
      // before the usage of Operators
      
      print(a_optional) --> nil
      print(b_optional) --> nil
      
      // Prefix Operator Usage
      
      print(/a_optional) --> ""
      print(/b_optional) --> 0
      
      // Postfix Operator Usage
      
      print(a_optional*?) --> ""
      print(b_optional*?) --> 0
      
    • Now it is your choice which operator you use, both serve the same purpose.

提交回复
热议问题