2016-09-03 24 views
12

Tôi có một enum trong C và chỉ số cần phải được đại diện bởi một String.Truy cập một chuỗi Enum theo chỉ số

Làm cách nào để có thể sử dụng Swift enum của loại Chuỗi theo chỉ số nguyên?

Tôi muốn sao chép enum thành Swift, đặt loại thành chuỗi và xác định tất cả các giá trị thô để hiển thị văn bản, sau đó sử dụng giá trị C enum để trích xuất văn bản giá trị thô cho chuỗi Swift enum.

Nếu không, tôi sẽ chỉ tạo một chuỗi các chuỗi .. Nhưng enum sẽ dễ sử dụng hơn.

Trả lời

22

Trong Swift, kiểu enum không giữ thông tin chỉ mục của các trường hợp (ít nhất, không được cung cấp cho người lập trình).

Vì vậy:

Làm thế nào có thể một enum Swift của String loại được sử dụng bởi chỉ số nguyên?

Câu trả lời là "Bạn không thể".


Bạn có thể ràng buộc Int (hoặc enum trường hợp) và String giá trị bằng nhiều cách khác hơn chỉ cần tạo một mảng các chuỗi ..

Ví dụ, nếu Strings ràng buộc của bạn có thể giống như trường hợp nhãn, bạn có thể viết một cái gì đó như thế này:

enum MyEnum: Int { 
    case foo 
    case bar 
    case baz 

    var string: String { 
     return String(self) 
    } 
} 

if let value = MyEnum(rawValue: 0) { 
    print(value.string) //->foo 
} 

Nếu Strings của bạn cần phải phức tạp nhiều hơn một chút để hiển thị văn bản, bạn có thể chúng tôi e Swift Dictionary để liên kết các trường hợp enum và Strings.

enum AnotherEnum: Int { 
    case foo 
    case bar 
    case baz 

    static let mapper: [AnotherEnum: String] = [ 
     .foo: "FooString", 
     .bar: "BarString", 
     .baz: "BazString" 
    ] 
    var string: String { 
     return AnotherEnum.mapper[self]! 
    } 
} 

if let value = AnotherEnum(rawValue: 1) { 
    print(value.string) //->BarString 
} 

dễ đọc hơn một chút so với một mảng đơn giản của chuỗi.

+0

Rất tốt, cảm ơn :) – jarryd

4

Giải pháp đơn giản cũng hữu ích nếu bạn muốn liệt kê một chuỗi enum.

enum MyEnum: String { 
    case foo = "fooString" 
    case bar = "barString" 
    case baz = "bazString" 

    static let allValues = [foo, bar, baz] //must maintain second copy of values 
} 

//enumeration advantage 
for value in MyEnum.allValues { 
    print(value) 
} 

//get value by index 
let value = MyEnum.allValues[1] 

print(value) //barString 
+0

hoàn toàn rực rỡ, cảm ơn bạn. Tôi nghi ngờ điều này sẽ làm cho nó thành ngôn ngữ chính nó. Trừ khi tất nhiên có một phương pháp có sẵn để truy cập vào cùng một .. –

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