Quiero declarar una función que sólo puedo usar para un solo enum caso.

Por ejemplo tengo CustomTextFieldTypes enum. Esto tiene los siguientes casos y funciones.

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

Ahora quiero llamar a la inputCardNumber(...) función sólo para el CustomTextFieldTypes.CardNumber caso. Puedo hacer lo siguiente…

CustomTextFieldTypes.CardNumber.inputCardNumber(...) 

Pero al mismo tiempo yo puedo hacer esto…

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

Sólo quiero llamar la inputCardNumber(...) función de la CardNumber caso. No de otro caso de la enumeración de sí mismo. ¿Cómo puedo lograr esto?

Gracias de antemano por cualquier ayuda

EDITAR – he Aquí algunos antecedentes sobre lo que estoy haciendo. Yo estaba escribiendo una prueba de interfaz de usuario que introducir en los campos de texto. Quería mantener el código de la entrada de mi archivo de prueba y empecé a «Experimentando» con las enumeraciones y enumeración de las funciones. Me preguntaba si yo podría tener una función explícitamente disponible para una enumeración de los casos. A juzgar por los comentarios no puedo hacer esto (lo busqué por internet pero no hasta el extremo). No es una mala arquitectura o cualquier cosa, se me acaba de dividir el código de la prueba..

Gracias por a todos por responder.

  • ¿Qué estás tratando de hacer? Y ¿por qué utilizar XCUIElement? Son solo para ensayos
  • ¿Por qué poner una función en un enum? ¿Cuál es el beneficio de esto?
  • Usted no puede hacer que una función disponible sólo para un caso de una enumeración. Cualquier función en una enumeración está disponible para cada caso de la enumeración. Desde su pequeño fragmento de código, parece que usted tiene una arquitectura problema y, probablemente, podría venir para arriba con un mejor diseño para hacer lo que quieres hacer. No disponemos de suficiente información para darle mejor asesoramiento.
  • ¿Por qué son inputCardNumber y inputCardCCVNumber funciones separadas que tienen las mismas implementaciones? Sospecho que hay más a su problema de lo que estamos describiendo aquí. De acuerdo con @keithbhunter que es probable que tenga un profundo problema de diseño. Sus tipos parecen de adentro hacia fuera.
  • He actualizado a la pregunta, gracias por la respuesta.
InformationsquelleAutor harmeet07 | 2016-08-19

3 Comentarios

  1. 11

    Puede realizar un interruptor en self con el fin de ejecutar cierto código para ciertos casos. He aquí un ejemplo:

    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. 2

    No sé exactamente por qué son XCUIElements necesario, pero hacer algo como esto

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

    Si realmente neeed XCUIElement, a continuación, cambie case CardType(String) a case CardType(String, XCUIElement) y actualización de todos los otros códigos como bien

  3. 1

    No hay necesidad de utilizar un interruptor cuando sólo se desea detectar un solo caso:

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

    }

Dejar respuesta

Please enter your comment!
Please enter your name here