2016-08-19 109 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 
     } 
    } 
}