2015-04-15 17 views
10

Uczę się szybko. Na pierwsze wrażenie nie mogę zobaczyć dowolny punkt deklarowania stałej (bez wartości początkowej przechowywanej) jako opcja w klasie ... na przykładSwift - użycie opcjonalnego z let

let userName: String? 

ponieważ domyślny initializer by przypisać go do zera i to byłoby miło” t następnie można zmienić (ponieważ jest stałą).

Jak rozumiem, zwyczaj inicjator można jeszcze przypisać wartość non-nil do niego, ale w tym przypadku nie wystarczy zadeklarować ją jako let userName: String (czyli non-opcja)

Liczyłam, że jeśli byłby to wzorzec zbędny, o którym jabłko wspomniałoby o tym, ale nie widzę, żeby ... tak, w jakich sytuacjach użyłaby opcjonalnej stałej deklaracji lub była przydatna?

+0

Przypuśćmy masz aplikację, w której użytkownicy rejestrują się za pośrednictwem poczty e-mail, i mogą na przykład wpisać nazwę użytkownika. I chcesz przekazać obie informacje do następnego kontrolera. Następny kontroler wie, że żadna z tych wartości nigdy nie zmieni się w czasie życia, ale nazwa użytkownika jest opcjonalna. W związku z tym deklarujesz go jako "String?". – Connor

Odpowiedz

15

Stała, która jest opcjonalna, musi mieć przypisaną wartość podczas procesu init. Ta wartość może wynosić zero lub inną wartość. Po przypisaniu utknęła w tej wartości. Wartość zero jest jak wskaźnik "ta właściwość celowo pozostawiona pusta", napisana permanentnym atramentem.

Powiedzmy, że masz klasę, która zostanie wypełniona danymi odpowiedzi z żądania sieciowego. Niektóre z otrzymanych pól mogą być zerowe lub mogą zawierać dane.

Piszesz kod, który analizuje odpowiedź z serwera i buduje obiekt odpowiedzi. Każda właściwość obiektu odpowiedzi jest stała. Zawiera dane, jeśli masz informacje o tej nieruchomości, lub zero.

W takim przypadku rozsądnie jest użyć opcjonalnej stałej.

Należy napisać metodę init dla obiektu odpowiedzi, który wymagałby odpowiedzi sieciowej (na przykład w JSON) i wypełnić właściwości obiektu odpowiedzi. Jeśli danego znacznika w danych JSON brakuje, ustaw tę właściwość na zero. Używa się stałej, ponieważ wartość jest ustalona po zainicjowaniu obiektu odpowiedzi. Jeśli jest zerowy, nie będzie trwało wiecznie. Jeśli zawiera wartość, zawsze będzie zawierał tę wartość i nie będzie można jej zmienić.

3

Jeśli jesteś wprowadzenie dosłownym i zrobić to opcjonalne, opcjonalna część jest bezużyteczny, bo wiesz, że number będzie 1

let number: Int? = 1 

Jednakże, jeśli chcesz, aby stały kopię inny obiekt, w którym nie wiesz, czy źródło będzie zerowe czy nie, to jest.

var array = ["hello"] 
let string: String? = array[1] 

// string is nil, so you can do some checking with it 

Powyższy przykład nie dość zilustrować mój punkt widzenia, ale zakładamy, że array jest zmienny tablica, która może być usuwanie i dodawanie wartości sporadycznie (gdzie można uzyskać wartość nil jeśli jesteś sprawdzanie za " 1 "indeks)

+2

Lepszym przykładem może być 'let ciąg: String? = array.first'. wyrażenie 'array [1]' ulegnie awarii, jeśli tablica nie zawiera 2 obiektów, gdzie 'array.first' zwraca opcjonalne, które zawiera zero, jeśli tablica jest pusta. –

1

jedyną zmienną opcja zostanie automatycznie ustawiona na zero, jeśli wartość początkowa nie umieszczono


Opcjonalny stałą typu T?NIE zostanie automatycznie ustawiona na zero
musi być ręcznie zainicjowane z wartości typu T lub nil

  • Jeśli nie zostanie ręcznie zainicjowane wcześniej używany, błąd „stała używane przed zainicjowany” będzie rzucony

  • Podobnie, jeśli klasa ma opcjonalny stałą właściwość bez wyraźnego, ręcznie inicjalizacji go i również ma zbudować, błąd „klasa nie ma żadnego incjalizatory” zostanie rzucony