web-dev-qa-db-ja.com

Swift enum関数は、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(...) 
_

CardNumberの場合のみinputCardNumber(...)関数を呼び出します。別のケースからではなく、列挙型自体。どうすればこれを達成できますか?

助けてくれてありがとう

編集-これが私がやっていることの背景です。テキストフィールドにテキストを入力するUIテストを作成していました。入力コードをテストファイルから遠ざけたいので、列挙型と列挙型関数を使用して "Experimenting"を開始しました。列挙型のケースで明示的に使用できる関数を作成できるかどうか疑問に思っていました。コメントから判断して、私はこれを行うことができません(オンラインで確認しましたが、うまく行きませんでした)。これは悪いアーキテクチャでも何でもありません。テストコードを分割するだけでした。

返信いただきありがとうございます。

12
harmeet07

特定の場合に特定のコードを実行するために、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
        }
    }
}
11
Aaron

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)に変更し、他のすべてのコードも更新します

2
hariszaman

1つのケースのみを一致させる場合は、スイッチを使用する必要はありません。

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

}

2
altyus