2016-08-18 20 views
9

tôi cần phải khai báo biến mà sẽ lưu trữ mảng enums loại khác nhau, Eg .:Swift - làm thế nào để khai báo biến/functon của/với enums loại khác nhau?

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

trình biên dịch rằng:

Loại biểu hiện là mơ hồ mà không bối cảnh nhiều hơn

Điều này sẽ là cần thiết để vượt qua bất kỳ enum hoặc đối tượng khác như là một tham số chức năng. Tuy nhiên tôi phát hiện ra rằng tôi có thể vượt qua Generics để đạt được điều này, Eg .:

func f1<T>(enum: T) 

nhưng có giao thức với các phương pháp tùy chọn (bắt đầu bằng @objc) nó là không thể.

+0

Bạn đề cập đến một giao thức @objc, có thể cho chúng tôi biết thêm về nó và vai trò gì có trong những gì bạn đang cố gắng để làm gì? –

+0

Sử dụng giao thức @objc là không tự nhiên để khai báo một số chức năng của chúng như là tùy chọn và sử dụng các đại biểu như các thuộc tính yếu. – Kaktusiarz

+0

Điều gì phù hợp với giao thức như vậy trong ví dụ của bạn? –

Trả lời

1

Điều này thật thú vị. Thay vì generics, tôi chỉ cần đi với Any, vì đó là cơ sở của tất cả mọi thứ.

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 

Sau đó, bạn sử dụng báo cáo chuyển đổi để chuyển tài sản thành nhiều tổ chức khác nhau và xử lý chúng tương ứng.

+0

Vấn đề là bạn không thể sử dụng bất kỳ hoặc Generics trong giao thức với các phương pháp tùy chọn. – Kaktusiarz

2

Bạn có thể sử dụng một giao thức ...

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

Cảm ơn bạn đã trả lời phần đầu tiên của câu hỏi nhưng nhiệm vụ chính không đạt được vì tôi ** không thể thu hẹp ** phương thức giao thức ** của tôi thành các tham số phù hợp với giao thức tùy chỉnh của bạn **. Có phải là chung chung hơn. – Kaktusiarz

Các vấn đề liên quan