2016-08-19 14 views
7

Chcę zadeklarować funkcję, której mogę użyć tylko w konkretnym przypadku wyliczenia. Na przykład mam wyliczenie CustomTextFieldTypes. Ma to następujące przypadki i funkcje.Funkcje Swift Enum

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

Teraz chcę wywołać funkcję inputCardNumber(...) tylko dla przypadku CustomTextFieldTypes.CardNumber. Mogę zrobić następujących ...

CustomTextFieldTypes.CardNumber.inputCardNumber(...) 

Ale w tym samym czasie mogę to zrobić ...

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

Chcę tylko wywołać funkcję inputCardNumber(...) dla przypadku CardNumber. Nie z innego przypadku sama enum. Jak to osiągnąć?

góry dzięki za wszelką pomoc

Edit- Oto niektóre tła na co robię. Pisałem test interfejsu użytkownika, który wprowadzał tekst do pól tekstowych. Chciałem zachować kod wejściowy z mojego pliku testowego i zacząłem "Experimenting" z funkcjami wyliczania i wyliczania. Zastanawiałem się, czy mogę mieć funkcję jawnie dostępną dla przypadku enum. Sądząc po komentarzach, nie mogę tego zrobić (sprawdziłem online, ale nie dotarłem daleko). To nie jest zła architektura ani nic, po prostu dzieliłem kod testowy ..

Dziękuję wszystkim za odpowiedź.

+0

Co próbujesz zrobić? I po co używać 'XCUIElement'? Są tylko do testu –

+0

Dlaczego umieścić funkcję w wyliczeniu? Jakie są tego korzyści? – Imbue

+1

Nie można wykonać funkcji dostępnej tylko dla jednego przypadku wyliczenia. Każda funkcja w wyliczeniu jest dostępna dla każdego przypadku wyliczenia. Z małego fragmentu kodu wynika, że ​​masz problem z architekturą i prawdopodobnie masz lepszy projekt, by zrobić to, co chcesz. Nie mamy wystarczających informacji, aby dać ci lepszą radę. – keithbhunter

Odpowiedz

2

nie wiem dokładnie dlaczego XCUIElements potrzebne, ale zrobić coś takiego

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

Jeśli naprawdę neeed XCUIElement następnie zmienić case CardType(String) do case CardType(String, XCUIElement) i aktualizować wszystkie inne kody, jak również

7

można wykonać przełącznik na self w celu wykonania określonego kodu dla niektórych przypadków. Oto przykład:

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 
     } 
    } 
} 
Powiązane problemy