簡體   English   中英

Swift枚舉函數只用於枚舉的單個案例?

[英]Swift enum function for only a single case of the enum?

我想聲明一個我只能用於單個特定枚舉案例的函數。

例如,我有CustomTextFieldTypes枚舉。 這具有以下情況和功能。

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

現在我想只為CustomTextFieldTypes.CardNumber案例調用inputCardNumber(...)函數。 我可以做以下......

CustomTextFieldTypes.CardNumber.inputCardNumber(...) 

但與此同時,我可以做到這一點......

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

我只是想打電話給inputCardNumber(...)的功能CardNumber情況。 不是來自另一個案例的枚舉本身。 我該如何實現這一目標?

在此先感謝您的幫助

編輯 - 這是我正在做的一些背景。 我正在編寫一個UI測試,可以將文本輸入到文本字段中。 我想保持輸入代碼遠離我的測試文件,我開始使用枚舉和枚舉函數進行“ 試驗 ”。 我想知道我是否可以為枚舉案件明確提供一個函數。 從評論來看,我不能這樣做(我在網上查了但沒有走得太遠)。 這不是一個糟糕的架構或任何東西,我只是拆分測試代碼..

感謝大家的回復。

您可以對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
        }
    }
}

不知道為什么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)

如果您真的需要XCUIElement,那么將case CardType(String)更改為case CardType(String, XCUIElement)並更新所有其他代碼

當您只想匹配單個案例時,無需使用開關:

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

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM