特定の列挙型の場合にのみ使用できる関数を宣言したい。
たとえば、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"を開始しました。列挙型のケースで明示的に使用できる関数を作成できるかどうか疑問に思っていました。コメントから判断して、私はこれを行うことができません(オンラインで確認しましたが、うまく行きませんでした)。これは悪いアーキテクチャでも何でもありません。テストコードを分割するだけでした。
返信いただきありがとうございます。
特定の場合に特定のコードを実行するために、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)
に変更し、他のすべてのコードも更新します
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)
}
}
}