2015-05-26 9 views
10

Wyliczenia Swift mają wartości powiązane i nieprzetworzone. Ale przypadki użycia tych wartości nie są dla mnie jasne. Byłbym bardzo wdzięczny, gdyby ktoś mógł wyjaśnić różnicę między wartościami skojarzonymi i surowymi, przykład byłby bardzo pomocny.Różnica między wartościami skojarzonymi i nieprzetworzonymi w wyliczeniach szybkich

+0

http://www.allinterview.com/showanswers/191460/in-swift-enumerations-s-difference-between-raw-values i-related-values.html – sasquatch

Odpowiedz

13

Surowe wartości są stosowane, gdy każdy przypadek w wyliczeniu jest reprezentowany przez wartość ustawioną podczas kompilacji. Są podobne do stałych, tj

let A = 0 
let B = 1 

jest podobny do:

enum E: Int { 
    case A // if you don't specify, IntegerLiteralConvertible-based enums start at 0 
    case B 
} 

Więc A ma stałą wartość surowego 0, B z 1 etc ustawiony w czasie kompilacji. Wszystkie muszą być tego samego typu (typ wartości nieprzetworzonej dotyczy całego wyliczenia, a nie każdego pojedynczego przypadku). Mogą to być wyłącznie łańcuchy, znaki lub liczby, które można zamienić na literalne. I wszystkie muszą być odrębne (żadne dwa wyliczenia nie mogą mieć tej samej wartości nieprzetworzonej).

wartości związane są bardziej zmienne, związane z jednej przypadków liczby:

enum E { 
    case A(Int) 
    case B 
    case C(String) 
} 

Tutaj A ma teraz skojarzony Int która może pomieścić żadnej wartości całkowitą. B z drugiej strony nie ma żadnej wartości skojarzonej. I C ma skojarzony String. Powiązane typy mogą być dowolnego typu, a nie tylko ciągami lub liczbami.

Każda podana wartość typu E będzie posiadać zawsze tylko jeden z odpowiedniego typu, to znaczy zarówno Int jeśli wyliczenia jest A lub String jeśli wyliczenia jest C. Potrzebuje tylko wystarczająco dużo miejsca na większy z nich. Typy takie jak te są czasami określane jako "dyskryminowane związki" - związek będący zmienną, która może posiadać wiele różnych typów, ale wiesz (z przypadku enum), którą trzyma.

Mogą nawet być ogólne. Najbardziej powszechnym przykładem jest Optional, który jest zdefiniowany w następujący sposób:

enum Optional<T> { 
    case .Some(T) 
    case .None 
} 
+0

jeśli jest to podobne: 'case A (orderNumber: Int, account: String)' jaki byłby wtedy powiązany typ? krotka na Int, String? – Honey

+0

@Honey "Zdefiniuj typ wyliczeniowy o nazwie Kod kreskowy, który może przyjmować wartość upc z powiązaną wartością typu (Int, Int, Int, Int) lub wartością qrCode z powiązaną wartością typu String." https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Enumerations.html – Sakshi

Powiązane problemy