【问题标题】:Passing An Enum Type As An Generic Argument To a Function in swift 2.2 iOS将枚举类型作为通用参数传递给 swift 2.2 iOS 中的函数
【发布时间】:2016-04-29 11:54:44
【问题描述】:

我是 Swift iOS 新手。我正在尝试使用枚举类型作为函数的输入参数。这里是

示例枚举类型:

public enum CFScreen {

public enum CFScreen_Newsfeed: Int {

    case Newsfeed_01 = 2100
    case Newsfeed_02 = 2101
    case Newsfeed_03 = 2102
    case Newsfeed_04 = 2103
    case Newsfeed_05 = 2104
    case Newsfeed_06 = 2105
    case Newsfeed_07 = 2106
    case Newsfeed_08 = 2107
}

public enum CFScreen_Groups: Int {

    case Create = 2200
    case GoBack = 2201
}
}

使用枚举类型作为输入参数的示例函数

func showCFScreenForEnumType(cFooter: CFScreen.CFScreen_Groups) {

    //Group Related
    switch cFooter {

    case .Create:
        print("Show Create Group")
        break

    case .GoBack:
        print("Show Go Back Screen")
        break
    }
}

func showCFScreenForEnumType(cFooter: CFScreen.CFScreen_Newsfeed) {

    //Group Related
    switch cFooter {

    case .Newsfeed_01:
        print("Show News 01")
        break

    case .Newsfeed_02:
        print("Show News 02")
        break

    case .Newsfeed_03:
        print("Show News 03")
        break

    case .Newsfeed_04:
        print("Show News 04")
        break

    case .Newsfeed_05:
        print("Show News 05")
        break

    case .Newsfeed_06:
        print("Show News 06")
        break

    case .Newsfeed_07:
        print("Show News 07")
        break

    case .Newsfeed_08:
        print("Show News 08")
        break
    }
}

如下调用这个函数

let selCFScreenG = CFScreen.CFScreen_Groups.Create
    showCFScreenForEnumType(selCFScreenG)

let selCFScreenNF = CFScreen.CFScreen_Newsfeed.Newsfeed_01
    showCFScreenForEnumType(selCFScreenNF)

参考链接:http://www.codingexplorer.com/enumerations-swift/

我的问题是如何编写一个一般接受枚举类型的函数,以便我可以将以下两个函数合并为一个

func showCFScreenForEnumType(cFooter: CFScreen.CFScreen_Groups)
func showCFScreenForEnumType(cFooter: CFScreen.CFScreen_Newsfeed)

【问题讨论】:

    标签: swift generics enums generic-programming swift2.2


    【解决方案1】:

    您可以为某个协议创建一个泛型类型约束,例如MyCFScreenEnums,只有CFScreen 中的两个枚举符合该协议,并且在使用此(类型约束)泛型的函数中,执行尝试的类型转换到两个枚举之一CFScreen.CFScreen_Newsfeed/CFScreen.CFScreen_Newsfeed。由于只有这两个符合MyCFScreenEnums,因此由于泛型(比如T)到MyCFScreenEnums 的类型约束,这些类型转换之一保证成功。

    protocol MyCFScreenEnums { }
    extension CFScreen.CFScreen_Newsfeed : MyCFScreenEnums {}
    extension CFScreen.CFScreen_Groups : MyCFScreenEnums {}
    
    func showCFScreenForEnumType<T: MyCFScreenEnums>(cFooter: T) {
        if let newsfeed = cFooter as? CFScreen.CFScreen_Newsfeed {
            switch newsfeed {
            case .Newsfeed_01: print("Show News 01")
            case .Newsfeed_02: print("Show News 02")
            case .Newsfeed_03: print("Show News 03")
            case .Newsfeed_04: print("Show News 04")
            case .Newsfeed_05: print("Show News 05")
            case .Newsfeed_06: print("Show News 06")
            case .Newsfeed_07: print("Show News 07")
            case .Newsfeed_08: print("Show News 08")
            }
        }
        else if let groups = cFooter as? CFScreen.CFScreen_Groups {
            switch groups {
            case .Create: print("Show Create Group")
            case .GoBack: print("Show Go Back Screen")
            }
        }
    }
    
    /* Example usage */
    let foo = CFScreen.CFScreen_Newsfeed.Newsfeed_03
    let bar = CFScreen.CFScreen_Groups.Create
    showCFScreenForEnumType(foo) // "Show News 03"
    showCFScreenForEnumType(bar) // "Show Create Group"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-04
      • 2023-03-28
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多