harmeet07
harmeet07

Reputation: 521

Swift enum function for only a single case of the enum?

I want to declare a function which I can only use for a single specific enum case.

For example I have CustomTextFieldTypes enum. This has the following cases and functions.

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)
    }
}

Now I want to call the inputCardNumber(...) function only for the CustomTextFieldTypes.CardNumber case. I can do the following...

CustomTextFieldTypes.CardNumber.inputCardNumber(...) 

But at the same time I can do this...

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

I only want to call the inputCardNumber(...) function for the CardNumber case. Not from another case the enum itself. How do I achieve this?

Thanks in advance for any help

EDIT- Here's some background on what I'm doing. I was writing a UI test which would input text into text fields. I wanted to keep the input code away from my test file and I started "Experimenting" with enums and enum functions. I was wondering if I could have a function explicitly available for an enum case. Judging from the comments I cannot do this (I checked online but didn't get far). It's not a bad architecture or anything, I was just splitting up test code..

Thanks for everyone for replying.

Upvotes: 18

Views: 28995

Answers (3)

altyus
altyus

Reputation: 606

No need to use a switch when you only want to match a single case:

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)
    }
  }
}

Upvotes: 9

Aaron
Aaron

Reputation: 6704

You can perform a switch on self in order to execute certain code for certain cases. Here's an example:

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
        }
    }
}

Upvotes: 16

hariszaman
hariszaman

Reputation: 8424

Dont know exactly why are XCUIElements needed but do something like this

//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)

If you really neeed XCUIElement then change case CardType(String) to case CardType(String, XCUIElement) and update all the other code as well

Upvotes: 4

Related Questions