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
Odpowiedz
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
}
jeśli jest to podobne: 'case A (orderNumber: Int, account: String)' jaki byłby wtedy powiązany typ? krotka na Int, String? – Honey
@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
http://www.allinterview.com/showanswers/191460/in-swift-enumerations-s-difference-between-raw-values i-related-values.html – sasquatch