2016-08-19 106 views
7

我想聲明一個函數,我只能用於特定的枚舉情況。例如,我有CustomTextFieldTypes枚舉。這有以下情況和功能。Swift枚舉函數

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

現在我要調用的函數inputCardNumber(...)只爲CustomTextFieldTypes.CardNumber情況。我可以做以下...

CustomTextFieldTypes.CardNumber.inputCardNumber(...) 

但在同一時間,我可以做到這一點...

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

我只是想呼籲CardNumber情況inputCardNumber(...)功能。從另一個案例來看,並不是枚舉本身。我如何實現這一目標?

預先感謝任何幫助

編輯 - 下面是關於我在做什麼的一些背景。我正在寫一個UI測試,它將文本輸入到文本字段中。我想保持輸入代碼遠離我的測試文件,並開始使用枚舉和枚舉函數「實驗」。我想知道如果我可以有一個函數顯式可用於枚舉的情況。從評論來看,我不能這樣做(我在網上查了一下,但沒有得到太多的結果)。這不是一個壞的架構或任何東西,我只是分裂測試代碼..

感謝大家的回覆。

+0

你想做什麼?爲什麼使用'XCUIElement'?它們僅用於測試 –

+0

爲什麼要將函數放入枚舉中?這有什麼好處? – Imbue

+1

您不能僅對一個枚舉情況提供函數。枚舉中的任何函數都可用於枚舉的每個情況。從你的小代碼片段看來,你似乎有一個架構問題,可能會想出更好的設計來做你想做的事情。我們沒有足夠的信息給你提供更好的建議。 – keithbhunter

回答

2

不要確切地知道爲什麼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) 

如果你真的neeed XCUIElement然後更改case CardType(String)case CardType(String, XCUIElement)和更新所有其他代碼以及

7

可以執行開關在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 
     } 
    } 
}