2016-08-18 2 views
9

мне нужно объявить переменную, которая будет хранить массив перечислений разного типа, например .:Swift - как объявить переменную/функционал/с перечислениями другого типа?

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

Компилятор гласит:

Тип выражения неоднозначное без больше контекста

Это необходимо для передачи любого перечисления или другого объекта в качестве параметра функции. Однако я обнаружил, что я могу передать дженерик для достижения этой цели, например .:

func f1<T>(enum: T) 

, но имеющие протокола с дополнительными методами (с префиксом @objc) невозможно.

+0

Вы упоминаете протокол @objc, может рассказать нам об этом, и какую роль должны в том, что вы пытаетесь сделать? –

+0

Использование @objc-протоколов - это immament, чтобы объявить некоторые из своих функций как необязательные и использовать таких делегатов как слабые свойства. – Kaktusiarz

+0

Что соответствует такому протоколу в вашем примере? –

ответ

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 

Вы затем использовать оператор переключения на обратном приведение в value свойства в ваши различные перечисления, и обрабатывать их соответствующим образом.

+0

Проблема в том, что вы не можете использовать Any или generics в протоколе с дополнительными методами. – Kaktusiarz

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) 
} 
+0

Благодарим вас за ответ на первую часть моего вопроса, но основная задача не была достигнута, потому что я ** не могу сузить ** мой метод протокола ** до параметров, которые соответствуют вашему пользовательскому протоколу **. Должно быть более общим. – Kaktusiarz

Смежные вопросы