swift - 将枚举类型作为通用参数传递给 swift 2.2 iOS 中的函数

标签 swift generics enums generic-programming swift2

我是 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)

最佳答案

您可以为某些协议(protocol)创建通用类型约束,例如 MyCFScreenEnums,只有 CFScreen 中的两个枚举符合该协议(protocol),并且在使用此协议(protocol)的函数中(类型受限)泛型,尝试将类型转换为两个枚举之一 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"

关于swift - 将枚举类型作为通用参数传递给 swift 2.2 iOS 中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36937744/

相关文章:

jsp - 与 JSTL 中的枚举值比较

java - 编译错误 - 用枚举切换

ios - 将 CollectionView 连接到 ViewController,连接 dataSource-Swift-XCode 时出错

ios - UIImagePickerController 也没有在首次使用时请求许可

ios - 如何使用 swift 显示 .svg 图像

java - 如何在比较器的映射中使用泛型以避免警告

java - 类型参数的意义是什么?为什么我们需要在返回类型中添加它一次,然后在修饰符和返回类型之间添加它?

swift - 我在 cygwin 上得到 "<unknown>:0: error: could not load the swift standard library"

java - 如何构建泛型类和构造函数以使用泛型方法?

java - 如何解决错误 : "MyClass.INSTANCE" is not a statement when I try to instantiate a singleton class in Java?