/ / Dlaczego możesz przypisać wartości opcjonalne do opcjonalnych typów w Swift? - szybka

Dlaczego możesz przypisać nie-opcjonalne wartości do typów opcjonalnych w Swift? - szybki

Dlaczego zadania obejmujące sprawdzanie opcji Swift? Na przykład w,

 var foo : Int? = 0
foo = foo!

foo i foo! nie mają tego samego typu. Czy nie trzeba zawijać nieopakowanej wartości, aby przypisać ją do opcjonalnego typu?

Odpowiedzi:

4 dla odpowiedzi № 1

Jest to część cukru syntaktycznego za opcjami. Przypisanie wartości innej niż opcjonalna to w jaki sposób owijasz go w opcjonalny typ.

Ponieważ opcjonalne wskazuje na obecność lub brak wartości, nie należy robić niczego specjalnego, aby wskazać obecność wartości innej niż dostarczenie. Na przykład w funkcji:

func gimmeSomethingMaybe() -> String? {
if arc4random_uniform(10) > 7 {
return "something"
} else {
return nil
}
}

Wyobraź sobie, że za każdym razem, gdy chciałeś zwrócić prawdziwą wartość z funkcji, która jest w stanie zwrócić zero, musiałeś napisać return Optional(value). To szybko się zestarzeje, prawda? Opcje opcjonalne są ważną cechą języka - nawet jeśli są one faktycznie zaimplementowane przez standardową bibliotekę, syntaktyczne zawijanie cukru / automatyczne ma na celu powstrzymanie go od żmudnego używania.


Edycja: po to, by pójść trochę dalej ... cukier również pomaga wymusić przekonanie, że rzeczywista wartość nie powinna być opcjonalna. Na przykład:

let one = 1
one? // error (in Swift 1.2, allowed but meaningless in Swift 1.1)
"two"? // error (ditto)

Możesz utworzyć opcjonalne zawijanie wartości rzeczywistej za pomocą Optional(one) inicjator, ale ma to niewielkie znaczenie semantyczne, więc prawie nigdy nie musisz.

Opcje opcjonalne powinny wchodzić w grę, gdy są„tajemnica” co do tego, czy wartość jest obecna, czy nie - to znaczy, kiedy jedna część programu otrzymuje wartość (lub brak wartości) zależy od stanu nieznanego tej części programu. Jeśli wiesz, że masz prawdziwą wartość, nie ma żadnej tajemnicy ... zamiast tego pozwalasz, by nieznany wszedł w grę na granicy między kodem, który zna wartość, a kodem, który nie wie - czyli funkcją Definicja / method / property, która przekazuje tę wartość gdzieś.


0 dla odpowiedzi nr 2

Po przeczytaniu odpowiedzi Rickstera wymyśliłem prostą odpowiedź na słowa laików. Dla mnie cała istota jego odpowiedzi brzmi

Ponieważ opcjonalne wskazuje obecność lub brak wartości, ty nie powinienem robić niczego specjalnego, aby wskazać obecność a wartość inna niż dostarczenie

Opcjonalnie to wyliczenie. Który ma 2 przypadki a lub b.

                                      String?
|
An enum with 2 cases
|
a               b
|               |
Set            notSet
|               |
any value like "hi"     nil

Więc możesz zrobić jedną z rzeczy, gdy chcesz przypisać ją do opcjonalnego.

Powiedz, że wartość jest albo:

  • a: to jest „cześć”
  • b: to nie jest ustawione, więc jest nil
  • c: jest równy innemu enum, czyli innemu opcjonalnemu

kod:

var str : String?
var anotherOptional : String?

str = nil // nil <-- this is like case b
str = "hi" // "hi" <-- this is like case a

str = anotherOptional // nil <-- this is like case c

anotherOptional = "hi again"
str = anotherOptional // "hi again" <-- this is like case c