【问题标题】:Swift - how to declare variable/functon of/with enums of different type?Swift - 如何使用不同类型的枚举声明变量/函数?
【发布时间】:2016-12-25 23:01:01
【问题描述】:

我需要声明一个变量来存储不同类型的枚举数组,例如:

var enums = [EnumTypeA.Option1, EnumTypeB.Option2]

编译器状态:

没有更多上下文的表达类型是模棱两可的

这对于将任何枚举或其他对象作为函数参数传递是必需的。但是我发现我可以通过泛型来实现这一点,例如:

func f1<T>(enum: T)

但是拥有带有可选方法的协议(以@objc 为前缀)是不可能的。

【问题讨论】:

  • 你提到了一个@objc 协议,可以告诉我们更多关于它的信息,以及在你想做的事情中扮演什么角色?
  • 使用@objc 协议来声明它们的一些功能是可选的,并使用这样的委托作为弱属性。
  • 在你的例子中什么符合这样的协议?
  • 具有请求类型描述的回调方法的请求委托。

标签: ios swift generics enums protocols


【解决方案1】:

这很有趣。我没有使用泛型,而是选择了Any,因为这是一切的基础。

enum TypeA {
    case Option1
    case Option2
}

enum TypeB {
    case Option1
    case Option2
}

func acceptDifferentEnums(value: Any) {
    switch value {
    case let typeA as TypeA:
        print("This is TypeA")
    case let typeB as TypeB:
        print("This is typeB")
    default:
        print("This is something else")
    }
}


acceptDifferentEnums(TypeA.Option1) // This is TypeA
acceptDifferentEnums(TypeB.Option2) // This is TypeB
acceptDifferentEnums("Foo") // This is something else

然后您使用 switch 语句将 value 属性向下转换为您的各种枚举,并相应地处理它们。

【讨论】:

  • 问题是你不能在协议中使用 Any 或泛型与可选方法。
【解决方案2】:

您可以使用协议...

protocol MyEnums {}

enum MyEnum1: MyEnums {
    case first, second
}

enum MyEnum2: MyEnums {
    case red, green
}

let myArray: [MyEnums] = [MyEnum1.first, MyEnum2.green]

func myFunc(myEnum: MyEnums) {
    print(myEnum)
}

for value in myArray {
    myFunc(myEnum: value)
}

【讨论】:

  • 感谢您回答我的问题的第一部分,但主要任务没有完成,因为我无法缩小我的协议方法符合的参数到您的自定义协议。必须更通用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-22
相关资源
最近更新 更多