调用方法的Swift枚举

问题描述 投票:2回答:2

说我有这样的枚举:

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() ...

swift enums
2个回答
3
投票

一个简单的解决方案是使用枚举作为字典的关键。假设它们都是无效的。你可以这样做:

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"

对我来说,它看起来比使用开关更干净。


2
投票

将函数插入枚举本身。您不再需要参数。您甚至可以使用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
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.