【问题标题】:Switch statement instead of a ton of if statementsSwitch 语句而不是大量的 if 语句
【发布时间】:2020-10-02 04:09:04
【问题描述】:

我目前正在处理通知并想打印出一个标识符。如何用一个开关替换所有 if 语句?

这是我的枚举,它将所有标识符与相应的字符串值一起保存:

    enum NotificationIdentifier:String {
    case local = "Local Notification"
    case localWithAction = "Local Notification with Action"
    case localWithContent = "Local Notification with Content"
    case pushWithAPNs = "Push Notification with  APNs"
    case pushWithFirebase = "Push Notification with Firebase"
    case pushWithContent = "Push Notification with Content"
}

还有我的委托方法:

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {

    if response.notification.request.identifier == NotificationIdentifier.local.rawValue {
        print("Handling notification with the \(NotificationIdentifier.local.rawValue)")
    } else if response.notification.request.identifier == NotificationIdentifier.localWithAction.rawValue {
        print("Handling notification with the \(NotificationIdentifier.localWithAction.rawValue)")
    } else if response.notification.request.identifier == NotificationIdentifier.localWithContent.rawValue {
        print("Handling notification with the \(NotificationIdentifier.localWithContent.rawValue)")
    } else if response.notification.request.identifier == NotificationIdentifier.pushWithAPNs.rawValue {
        print("Handling notification with the \(NotificationIdentifier.pushWithAPNs.rawValue)")
    } else if response.notification.request.identifier == NotificationIdentifier.pushWithFirebase.rawValue {
        print("Handling notification with the \(NotificationIdentifier.pushWithFirebase.rawValue)")
    } else {
        print("Handling notification with the \(NotificationIdentifier.pushWithContent.rawValue)")
    }

    completionHandler()
}

【问题讨论】:

  • 感谢新用户提出的优秀、基本的问题。如果写得正确,本网站欢迎基本问题,再次感谢。

标签: ios swift if-statement switch-statement uilocalnotification


【解决方案1】:

初始化NotificationIdentifierenum 并使用如下switch case:

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
    guard let notificationIdentifier = NotificationIdentifier(rawValue: response.notification.request.identifier) else { return }
    switch notificationIdentifier {
    case .local:
    print("Handling notification with the \(NotificationIdentifier.local.rawValue)")
    case .localWithAction:
    print("Handling notification with the \(NotificationIdentifier.localWithAction.rawValue)")
    case .localWithContent:
    print("Handling notification with the \(NotificationIdentifier.localWithContent.rawValue)")
    case .pushWithAPNs:
    print("Handling notification with the \(NotificationIdentifier.pushWithAPNs.rawValue)")
    case .pushWithFirebase:
    print("Handling notification with the \(NotificationIdentifier.pushWithFirebase.rawValue)")
    case .pushWithContent:
    print("Handling notification with the \(NotificationIdentifier.pushWithContent.rawValue)")
    }
}

【讨论】:

    【解决方案2】:

    如果您只想打印出一个标识符,您可以使用单个打印语句:

    let notificationIdentifier = NotificationIdentifier.init(rawValue: response.notification.request.identifier) ?? .pushWithContent)
    print("Handling notification with the \(notificationIdentifier.rawValue)")
    

    这也将涵盖默认值(例如.pushWithContent)。

    【讨论】:

      【解决方案3】:

      你可以避免这样的 switch 和 if else 语句......你得到NotificationIdentifier 这段代码的情况......

      func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
      
      
          if let notificationIdentifier =   NotificationIdentifier(rawValue: response.notification.request.identifier) {
      
              print("Handling notification with the \(notificationIdentifier.rawValue)")
      
              switch notificationIdentifier {
              case .local:
                  print("Handle local")
              case .localWithAction:
                  print("Handle localWithAction")
              case .localWithContent:
                  print("Handle localWithContent")
              case .pushWithAPNs:
                  print("Handle pushWithAPNs")
              case .pushWithFirebase:
                  print("Handle pushWithFirebase")
              case .pushWithContent:
                  print("Handle pushWithContent")
      
              }
      
      
          } else {
              print("cant convert to NotificationIdentifier")
          }
      
          completionHandler()
      }
      

      【讨论】:

        【解决方案4】:

        你可以像这样在 Enum 上使用 switch case:

        func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
            switch response.notification.request.identifier {
                case .local:
                    print("local")
                case .localWithAction:
                    print("localWithAction")
                case .localWithAction:
                    print("localWithAction")
                case .localWithContent:
                    print("localWithContent")
                case .pushWithAPNs:
                    print("pushWithAPNs")
                case .pushWithFirebase:
                    print("pushWithFirebase")
            default:
                print("pushWithContent")
            }
            completionHandler()
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-03-02
          • 1970-01-01
          • 1970-01-01
          • 2010-10-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多