簡體   English   中英

調用方法的Swift枚舉

[英]Swift enums that call a method

說我有一個這樣的枚舉:

enum ItemType {
    case TypeOne
    case TypeTwo
    case TypeThree
}

然后,我有一個方法,該方法根據所選的ItemType調用另一個方法:

func getItem(withType: ItemType) {
    switch withType {
        case TypeOne:
            getTypeOneItem()
        case TypeTwo:
            getTypeTwoItem()
        case TypeThree:
            getTypeThreeItem()
    }
}

我只是想知道是否有更好的方法來編寫此代碼,如果我有很多ItemTypes則switch語句將變得非常混亂。

不知道這是可能的,但也許一個enum調用直接的方法, enum xx { case TypeOne: ?? = getTypeOneItem() ... enum xx { case TypeOne: ?? = getTypeOneItem() ...

一個簡單的解決方案是使用枚舉作為字典的鍵。 假設它們都是空的。 您可以執行以下操作:

import Foundation

enum ItemType
{
    case TypeOne
    case TypeTwo
    case TypeThree
}

func getTypeOneItem() -> Void
{
    print("One")
}

func getTypeTwoItem() -> Void
{
    print("Two")
}

func getTypeThreeItem() -> Void
{
    print("Three")
}

// Register all the enum values
let dict =  [ItemType.TypeOne: getTypeOneItem, ItemType.TypeTwo: getTypeTwoItem, ItemType.TypeThree: getTypeThreeItem]

// Fetch
let function1 = dict[ItemType.TypeOne]!

function1() // This prints "One"

對我來說,它看起來比使用開關更干凈。

將函數插入到枚舉本身。 您不再需要參數。 您甚至可以使用static將其添加到類型中,但這沒有任何意義,因為您始終需要使用ItemType類型的變量。

func getTypeOneItem() -> Void {
    print("typeOne")
}

func getTypeTwoItem() -> Void {
    print("typeTwo")
}

func getTypeThreeItem() -> Void {
    print("typeThree")
}

enum ItemType {
    case TypeOne
    case TypeTwo
    case TypeThree

    func getItem() -> Void {
        switch self {
        case .TypeOne:
            getTypeOneItem()
        case .TypeTwo:
            getTypeTwoItem()
        case .TypeThree:
            getTypeThreeItem()
        }
    }
}

let item: ItemType = ItemType.TypeOne
item.getItem() // prints typeOne

暫無
暫無

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

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