2014-07-09 25 views
7

Tôi muốn sử dụng java giống như enums, nơi bạn có thể có enum trường hợp với dữ liệu tùy chỉnh. Ví dụ:Enums với dữ liệu trong swift

enum Country { 
    case Moldova(capital: "Chișinău", flagColors: [Color.Blue, Color.Yellow, Color.Red]); 
    case Botswana(capital: "Gaborone", flagColors: [Color.Blue, Color.White, Color.Black]); 
} 

Sau này tôi có thể viết:

Country.Moldova.capital; 

Dường như tôi có thể chỉ ra các biến, nhưng không phải là giá trị, và tôi chỉ có thể gán các giá trị khi sử dụng enum, không khai báo . Đó sẽ là cách tốt nhất để bắt chước hành vi này?

Trả lời

11

bạn có thể làm một cái gì đó như thế này, mà có thể hữu ích: (có nghĩa là rất ví dụ chung chung)

enum Country : Int { 
    case Moldova, Botwana; 

    // 

    func capital() -> String { 
     switch (self) { 
     case .Moldova: 
      return "Chișinău" 
     case .Botwana: 
      return "Gaborone" 
     default: 
      return "" 
     } 
    } 

    // 

    func flagColours() -> Array<UIColor> { 
     switch (self) { 
     case .Moldova: 
      return [UIColor.blueColor(), UIColor.yellowColor(), UIColor.redColor()] 
     case .Botwana: 
      return [UIColor.blueColor(), UIColor.whiteColor(), UIColor.blackColor()] 
     default: 
      return [] 
     } 
    } 

    // 

    func all() -> (capital: String, flagColours: Array<UIColor>) { 
     return (capital(), flagColours()) 
    } 

    // 

    var capitolName: String { 
    get { 
     return capital() 
    } 
    } 

    // 

    var flagColoursArray: Array<UIColor> { 
    get { 
     return flagColours() 
    } 
    } 

} 

sau đó bạn có thể truy cập đến các chi tiết như thế này:

let country: Country = Country.Botwana 

có được vốn

theo cách đó:

let capital: String = country.capital() 

này hay cách khác:

let capital: String = country.all().capital 

hoặc thứ ba:

let capital: String = country.capitolName 

có được màu sắc các cờ của:

theo cách đó:

let flagColours: Array<UIColor> = country.flagColours() 

này hay cách khác:

let flagColours: Array<UIColor> = country.all().flagColours 

hoặc một phần ba một:

let flagColours: Array<UIColor> = country.flagColoursArray 
+0

Đây là những gì tôi đã kết thúc làm, mặc dù tôi không nghĩ rằng đó là lý tưởng, nó mimmic hành vi tôi đang tìm kiếm. –

2

Rất tiếc, có vẻ như các thư mục có số raw values bị giới hạn ở các giá trị theo nghĩa đen. Bạn có thể muốn file a bug.

Là một thay thế, bạn có thể làm một cái gì đó như thế này:

let Country = (
    Moldova: (capital: "Chișinău", flagColors: [Color.Blue, Color.Yellow, Color.Red]), 
    Botswana: (capital: "Gaborone", flagColors: [Color.Blue, Color.White, Color.Black]) 
) 

hay này:

struct Country { 
    let capital: String 
    let flagColors: [Color] 
} 

let Countries = (
    Moldova: Country(capital: "Chișinău", flagColors: [.Blue, .Yellow, .Red]), 
    Botswana: Country(capital: "Gaborone", flagColors: [.Blue, .White, .Black]) 
) 
2

Dưới đây là một ví dụ chung khác tương tự như ví dụ được đăng bởi holex, nhưng gần hơn một chút về cách nó trông giống như trong Java. (Tôi thích nó bởi vì tất cả các dữ liệu tùy chỉnh là ở một nơi). Thay vì chuyển sang 'tự' trong các phương thức riêng biệt, tôi chỉ cần tạo một từ điển tĩnh ánh xạ từng trường hợp vào một bộ chứa dữ liệu thích hợp. Sau đó, tôi có var tiện lợi để có được dữ liệu một cách dễ dàng.

enum TestEnum { 
    case One 
    case Two 
    case Three 

    private static let associatedValues = [ 
     One: (int: 1, double: 1.0, string: "One"), 
     Two: (int: 2, double: 2.0, string: "Two"), 
     Three: (int: 3, double: 3.0, string: "Three") 
    ] 

    var int: Int { 
     return TestEnum.associatedValues[self]!.int; 
    } 

    var double: Double { 
     return TestEnum.associatedValues[self]!.double; 
    } 

    var string: String { 
     return TestEnum.associatedValues[self]!.string; 
    } 
} 

Bạn có thể truy cập dữ liệu tùy chỉnh như sau:

println(TestEnum.One.int)  // 1 
println(TestEnum.Two.double) // 2.0 
println(TestEnum.Three.string) // Three 
Các vấn đề liên quan