【问题标题】:Is it possible group & represent multiple cases as another case within an enum in Swift?是否可以在 Swift 的枚举中将多个案例分组并表示为另一个案例?
【发布时间】:2021-11-14 03:54:42
【问题描述】:

这就是我的意思。

enum Device {
    case iPhone_13Pro, iPhone_12Pro
    
    case iPadPro_129
    case iPadPro_11
}

// Hypothetical Scenario
enum Device_Group {
    case iPhones
    case iPads
}

有什么办法可以像上面那样代表一组这样的案例(它可以是另一个枚举或同一个枚举中的不同案例 - 这样我就可以像下面那样做?

// DO THIS
switch device {
   case iPhones:
        print("These are iPhones")

   case iPads:
        print("These are iPads")
}

// INSTEAD OF THIS
switch device {
   case .iPhone_13Pro, .iPhone_12Pro:
        print("These are iPhones")

   case .iPadPro_129, .iPadPro_11:
        print("These are iPads")
}

我不知道这是否是一个奇怪的问题,但我发现在使用 switch 语句时对多个案例进行分组有一定的好处。对此有任何建议将不胜感激。提前致谢。

【问题讨论】:

标签: swift enums switch-statement


【解决方案1】:

您可以使用嵌套枚举和带参数的案例

enum Devices {
    case phone(iPhone)
    case tablet(iPad)

    enum iPhone {
        case phone7
        case phoneX
    }

    enum iPad {
        case mini
        case pro
    }
}

let randomDevice = Devices.phone(.phone7)

switch randomDevice {
    case .phone: 
        print("Its a phone")
    default:
        break
}

// prints "Its a phone"

【讨论】:

    【解决方案2】:

    您可以为 iPhone 和 iPad 定义两个不同的枚举,然后将它们用作设备类型的关联值。

    https://docs.swift.org/swift-book/LanguageGuide/Enumerations.html


    enum Ipad {
        case iPadAir
        case iPadPro
    }
    
    enum Iphone {
        case iPhone12
        case iPhone13
    }
    
    enum Device {
        case iPad(model: Ipad)
        case iPhone(model: Iphone)
    }
    
    func findDeviceType(device: Device) {
        switch device {
        case .iPad:
            print("iPad")
        case .iPhone:
            print("iPhone")
        }
    }
    
    findDeviceType(device: Device.iPad(model: .iPadAir)) // iPad
    

    【讨论】:

      【解决方案3】:

      您也可以查看OptionSet,它是对您的商品进行分组和序列化的灵活方法,因为它们具有独特的价值。例如:

      struct Device: OptionSet {
          let rawValue: Int
      
          static let iPhone_13Pro = Self(rawValue: 1 << 0)
          static let iPhone_12Pro = Self(rawValue: 1 << 1)
          
          static let iPadPro_129 = Self(rawValue: 1 << 2)
          static let iPadPro_11 =  Self(rawValue: 1 << 3)
      
          static let iPhone: Self = [.iPhone_13Pro, .iPhone_12Pro]
          static let iPad: Self = [.iPadPro_129, .iPadPro_11]
          
          static let all: Self = [.iPhone, .iPad]
      }
      
      let device = Device.iPhone_13Pro
      
      if Device.iPhone.contains(device) {
          print("It's iPhone")
      }
      

      【讨论】:

      • 只是想进一步了解。是否有任何特殊原因/情况可能会在枚举上使用 OptionSet - 比如在性能或内存分配方面?
      猜你喜欢
      • 2017-03-31
      • 1970-01-01
      • 2021-09-25
      • 2012-08-11
      • 1970-01-01
      • 2016-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多