Zastanawiam się, w jaki sposób typy wartości w Swift (Int, Float ...) są zaimplementowane, aby obsługiwać opcjonalne powiązanie ("?"). Zakładam, że te typy wartości nie są przydzielane na stercie, ale na stosie. Czy więc polegają one na wskaźniku do stosu, który może mieć wartość zerową, czy też bazowa struktura zawiera flagę logiczną?W jaki sposób zaimplementowane są opcjonalne wartości w Swift?
Odpowiedz
Opcje są implementowane jako Swift w postaci enum
.
Zobacz Apple's Swift Tour na przykład jak to zrobić:
enum OptionalValue<T> {
case None
case Some(T)
}
Istnieje również inny typ o nazwie "ImplicitlyUnwrappedOptional". – Sulthan
i wtedy myślę, że pytanie będzie ... w jaki sposób są implementowane enum? :) – newacct
Wyobrażam sobie, że * oznaczone związki * są używane, co oznacza, że każda wartość ma powiązany z nią znacznik. Jak inaczej można przechowywać "Double?"? – wcochran
opcjonalne są realizowane, jak pokazano poniżej. Aby to znaleźć, kliknij CMD na deklarację, taką jak var x: Optional<Int>
. var x: Int?
to po prostu cukier syntaktyczny.
enum Optional<T> : LogicValue, Reflectable {
case None
case Some(T)
init()
init(_ some: T)
/// Allow use in a Boolean context.
func getLogicValue() -> Bool
/// Haskell's fmap, which was mis-named
func map<U>(f: (T) -> U) -> U?
func getMirror() -> Mirror
}
Swift jest open source since wczoraj. Można zobaczyć realizację na GitHub: https://github.com/apple/swift/blob/master/stdlib/public/core/Optional.swift
public enum Optional<Wrapped> : ExpressibleByNilLiteral {
case none
case some(Wrapped)
public init(_ some: Wrapped) { self = .some(some) }
public init(nilLiteral:()) {
self = .none
}
public var unsafelyUnwrapped: Wrapped {
get {
if let x = self {
return x
}
_debugPreconditionFailure("unsafelyUnwrapped of nil optional")
}
}
}
Większość odpowiedzi po prostu powiedzieć, że OPCJE Swift są realizowane z enum
s który nasuwa pytania, w jaki sposób są następnie enum
s realizowane. Należy użyć czegoś podobnego do oznaczonych związków C. Na przykład, Swift enum
enum Foo {
case None
case Name(String)
case Price(Double)
}
może być mimick'ed w C następująco:
enum {FOO_NONE_, FOO_NAME_, FOO_PRICE_};
typedef struct {
int flavor; // FOO_NONE_, FOO_NAME_ or FOO_PRICE_
union {
char *Name; // payload for FOO_STRING_
double Price; // payload for FOO_DOUBLE_
} u;
}
- 1. W jaki sposób CSS i DOM są zaimplementowane w przeglądarce?
- 2. W jaki sposób automaty skończone są zaimplementowane w kodzie?
- 3. W jaki sposób sygnał i gniazda są zaimplementowane pod maską?
- 4. W jaki sposób ** zostało zaimplementowane w Pythonie?
- 5. W jaki sposób zdefiniowane są funkcje globalne w Swift?
- 6. Jak to opcjonalne w tablicy w Swift
- 7. W jaki sposób zaimplementowane jest zakończenie tabulacji dla poleceń Linuksa?
- 8. W jaki sposób zaimplementowane w Ruby są stałe __LINE__ i __FILE__?
- 9. W Angular2, w jaki sposób zwracane są wartości usługi?
- 10. W jaki sposób przechowywane są obiekty wartości w bazie danych?
- 11. Dynamiczne opcjonalne właściwości w Swift 2.0
- 12. Wpisz odlewane opcjonalne wartości
- 13. W jaki sposób pliki .apk są podpisywane?
- 14. Jakie są blokady odczytu/zapisu zaimplementowane w pthread?
- 15. Swift - Czy etykiety na parametrach konstruktora są opcjonalne?
- 16. Dlaczego zmienne blokowe są opcjonalne?
- 17. W jaki sposób qDebug() wyświetla wartości wyliczone?
- 18. W jaki sposób zestawy tablic i zestawy sortowania zaimplementowane pod maską w Ruby
- 19. W jaki sposób "tagbody" i "go" zostały zaimplementowane pod maską w Common Lisp?
- 20. W jaki sposób tworzone są literały łańcuchowe?
- 21. W jaki sposób przetwarzane są `: ~ @` i `:! @`?
- 22. W jaki sposób reprezentowane są jednostki miary?
- 23. W jaki sposób używane są słabe tablice?
- 24. W jaki sposób są rozwiązywane symbole zewnętrzne?
- 25. W jaki sposób są zapisywane wiadomości logcat
- 26. W jaki sposób są analizowane szablony Django?
- 27. W jaki sposób wybierane są rozmiary buforów?
- 28. W jaki sposób są wyliczane w pliku web.config?
- 29. W jaki sposób Ruby zwraca dwie wartości?
- 30. W jaki sposób string.Format obsługuje wartości puste?
Bonus: kto wiadome odpowiedź: Jak i gdzie możemy znaleźć taką odpowiedź dla danego materiału siewnego Swift (tylko w przypadku zmiany w przyszłości) –
możliwy duplikat [Co oznacza wykrzyknik w języku Swift?] (http://stackoverflow.com/questions/24018327/what-does-an-exclamation-mark- mean-in-the-swift-language) – Sulthan