2016-08-18 12 views
9

muszę zadeklarować zmienną, która będzie przechowywać tablicę teksty stałe różnego typu, np .:Swift - jak zadeklarować zmienną/functon z/z wyliczeniami innego typu?

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

Compiler stwierdza:

Rodzaj ekspresji jest niejednoznaczna bez dalszych kontekście

Będzie to konieczne do przekazania dowolnego wyliczenia lub innego obiektu jako parametru funkcji. Jednak odkryłem, że mogę przekazać rodzajowych aby to osiągnąć, np .:

func f1<T>(enum: T) 

ale o protokół z opcjonalnych metod (z prefiksem @objc) jest to niemożliwe.

+0

Możesz wspomnieć protokół @objc, może nam powiedzieć więcej na ten temat i jaką rolę ma w tym, co próbujesz zrobić? –

+0

Używanie protokołów @objc jest niezobowiązujące, aby zadeklarować niektóre z ich funkcji jako opcjonalne i używając takich delegatów jako słabych właściwości. – Kaktusiarz

+0

Co jest zgodne z takim protokołem w twoim przykładzie? –

Odpowiedz

1

To było zabawne. Zamiast leków generycznych po prostu poszedłem z Any, ponieważ to jest podstawą wszystkiego.

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 

wtedy użyć instrukcji switch do spuszczonymi właściwość value w swoich różnych teksty stałe i przetwarzać je odpowiednio.

+0

Problem polega na tym, że nie można używać Dowolnych lub generycznych w protokole z opcjonalnymi metodami. – Kaktusiarz

2

Można użyć protokołu ...

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

Dziękuję za odpowiedź na pierwszą część mojego pytania, ale główne zadanie nie zostało osiągnięte, ponieważ ** nie można zawęzić ** mojej metody protokołu ** do parametrów zgodnych z niestandardowym protokołem **. Musi być bardziej ogólny. – Kaktusiarz

Powiązane problemy