【问题标题】:Swift enum function for only a single case of the enum?Swift枚举函数仅适用于枚举的一个案例?
【发布时间】:2016-12-26 22:42:39
【问题描述】:

我想声明一个只能用于单个特定枚举案例的函数。

例如,我有 CustomTextFieldTypes 枚举。这有以下几种情况和作用。

enum CustomTextFieldTypes {

    case CardType
    case CardNumber
    case CardExpiryDate
    case CardName
    case CCVNumber

    func inputCardNumber(cardNumber: String!, cardNumberTextField: XCUIElement?) {        
       cardNumberTextField?.typeText(cardNumber)
    }

    func inputCardCCVNumber(cardCCVNumber: String!, cardCCVNumberTextField: XCUIElement?) {        
       cardCCVNumberTextField?.typeText(cardCCVNumber)
    }
}

现在我只想为CustomTextFieldTypes.CardNumber 的情况调用inputCardNumber(...) 函数。我可以做到以下...

CustomTextFieldTypes.CardNumber.inputCardNumber(...) 

但同时我可以做到这一点......

CustomTextFieldTypes.CardExpiryDate.inputCardNumber(...) or    
CustomTextFieldTypes.CardNumber.inputCardNumber(...) 

我只想为CardNumber 的情况调用inputCardNumber(...) 函数。不是从另一个案例中枚举本身。我如何做到这一点?

提前感谢您的帮助

编辑-这是我正在做的一些背景。我正在编写一个 UI 测试,它将文本输入到文本字段中。我想让输入代码远离我的测试文件,我开始使用枚举和枚举函数“Experimenting”。我想知道我是否可以为枚举案例明确提供一个函数。从 cmets 来看,我不能这样做(我在网上查了一下,但没有走远)。这不是一个糟糕的架构或任何东西,我只是在拆分测试代码..

感谢大家的回复。

【问题讨论】:

  • 你想做什么?为什么要使用XCUIElement?它们仅用于测试
  • 为什么要将函数放在枚举中?这样做有什么好处?
  • 你不能让一个函数只对枚举的一种情况可用。枚举中的任何函数都可用于枚举的每种情况。从您的小代码 sn-p 来看,您似乎遇到了架构问题,并且可能会想出一个更好的设计来做您想做的事情。我们没有足够的信息给您更好的建议。
  • 为什么inputCardNumberinputCardCCVNumber 具有相同实现的不同函数?我怀疑你的问题比你在这里描述的要多。同意@keithbhunter,您可能有更深层次的设计问题。你的类型看起来是由内而外的。
  • 我已经更新了问题,感谢您的回复。

标签: ios swift function enums


【解决方案1】:

您可以在self 上执行开关,以便在某些情况下执行某些代码。这是一个例子:

enum CustomTextFieldTypes {

    case cardType
    case cardNumber
    case cardExpiryDate
    case cardName
    case ccvNumber

    func inputCardNumber(cardNumber: String!, cardNumberTextField: XCUIElement?) {  
        switch self {
        case .cardNumber:
            cardNumberTextField?.typeText(cardNumber)
        default:
            return
        }
    }
}

【讨论】:

  • 这仍然为所有情况添加了一个功能,但它只对某些情况起作用。将枚举拆分为不同的枚举,然后添加协议一致性将是更好的方法。
【解决方案2】:

只想匹配单个大小写时无需使用开关:

enum CustomTextFieldTypes {

  case cardType
  case cardNumber
  case cardExpiryDate
  case cardName
  case ccvNumber

  func inputCardNumber(cardNumber: String!, cardNumberTextField: XCUIElement?) {
    if case .cardNumber = self {
        cardNumberTextField?.typeText(cardNumber)
    }
}

}

【讨论】:

    【解决方案3】:

    不知道为什么需要 XCUIElements,但可以这样做

    //MARK: Declaration
    enum CustomTextFieldTypes {
        case CardType(String)
        case CardNumber(String)
        case CardExpiryDate(String)
        case CardName(String)
        case CCVNumber(String)
    }
    
    //MARK: Definition
    var cardNumber = CustomTextFieldTypes.CardNumber("123")
    var cardExpiry = CustomTextFieldTypes.CardExpiryDate("10-10-2016")
    
    //MARK: Usage
    func useCard(type: CustomTextFieldTypes)
    {
        switch type {
        case .CardNumber(let numberString):
              print(numberString)
        case .CardType(let cardtype):
              print(cardtype)
        case .CardExpiryDate(let expiryDate):
              print(expiryDate)
        case .CardName(let name):
              print(name)
        case .CCVNumber(let ccvnumber):
            print(ccvnumber)
        }
    
    }
    
    useCard(cardNumber)
    useCard(cardExpiry)
    

    如果您真的需要 XCUIElement,请将 case CardType(String) 更改为 case CardType(String, XCUIElement) 并更新所有其他代码

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-09
      • 1970-01-01
      • 2020-10-19
      • 2015-11-16
      • 2018-12-14
      • 2021-09-22
      • 1970-01-01
      相关资源
      最近更新 更多