Zanim będę mógł opisać przypadki użycia opcji niejawnie nieopakowanych, powinieneś już zrozumieć, jakie są opcje i niejawnie nieopakowane opcje w programie Swift. Jeśli nie, polecam najpierw przeczytać mój artykuł na temat opcji
Kiedy używać opcji niejawnie nieopakowanej
Istnieją dwa główne powody, dla których można utworzyć niejawnie nieopakowane opcjonalne. Wszystko to ma związek ze zdefiniowaniem zmiennej, do której nigdy nie będzie dostęp, nil
ponieważ w przeciwnym razie kompilator Swift zawsze zmusi cię do jawnego rozpakowania Opcjonalnego.
1. Stała, której nie można zdefiniować podczas inicjalizacji
Każda stała elementu musi mieć wartość przed zakończeniem inicjalizacji. Czasami stała nie może zostać zainicjalizowana z jej prawidłową wartością podczas inicjalizacji, ale nadal można zagwarantować, że będzie miała wartość przed uzyskaniem dostępu.
Użycie zmiennej opcjonalnej pozwala obejść ten problem, ponieważ opcja jest inicjowana automatycznie, nil
a wartość, którą ostatecznie będzie zawierała, pozostanie niezmienna. Jednak ciągłe rozpakowywanie zmiennej, która na pewno nie jest zerowa, może być uciążliwe. Niejawnie nieopakowane opcje osiągają takie same korzyści jak opcjonalne z dodatkową korzyścią, że nie trzeba ich wszędzie rozpakowywać.
Świetnym przykładem tego jest sytuacja, gdy zmiennej członka nie można zainicjować w podklasie UIView, dopóki widok nie zostanie załadowany:
class MyView: UIView {
@IBOutlet var button: UIButton!
var buttonOriginalWidth: CGFloat!
override func awakeFromNib() {
self.buttonOriginalWidth = self.button.frame.size.width
}
}
W tym przypadku nie można obliczyć oryginalnej szerokości przycisku, dopóki widok nie zostanie załadowany, ale wiadomo, że awakeFromNib
zostanie on wywołany przed jakąkolwiek inną metodą w widoku (inną niż inicjalizacja). Zamiast wymuszać jawne rozpakowywanie wartości bez sensu w całej klasie, możesz zadeklarować ją jako niejawnie nieopakowaną opcję.
2. Gdy aplikacja nie może odzyskać sprawności po zmiennej treści nil
Powinno to być niezwykle rzadkie, ale jeśli aplikacja nie może kontynuować działania, jeśli zmienna jest nil
dostępna, dostęp do niej byłby stratą czasu nil
. Zwykle jeśli masz warunek, który musi być absolutnie prawdziwy, aby aplikacja mogła nadal działać, możesz użyć assert
. Implicitly Unwrapped Opcjonalnie ma wbudowane w nią potwierdzenie zerowe. Nawet wtedy dobrze jest rozpakować opcjonalne i użyć bardziej opisowego potwierdzenia, jeśli jest zero.
Kiedy nie należy używać opcji niejawnie nieopakowanej
1. Zmienne obliczane przez Lazily
Czasami masz zmienną składową, która nigdy nie powinna być zerowa, ale podczas inicjalizacji nie można jej ustawić poprawnej wartości. Jednym z rozwiązań jest użycie opcjonalnie nieopakowanej opcji, ale lepszym sposobem jest użycie leniwej zmiennej:
class FileSystemItem {
}
class Directory : FileSystemItem {
lazy var contents : [FileSystemItem] = {
var loadedContents = [FileSystemItem]()
// load contents and append to loadedContents
return loadedContents
}()
}
Teraz zmienna contents
składowa nie jest inicjowana aż do pierwszego dostępu. Daje to klasie szansę na przejście do właściwego stanu przed obliczeniem wartości początkowej.
Uwaga: może to wydawać się sprzeczne z nr 1 z góry. Należy jednak wprowadzić istotne rozróżnienie. buttonOriginalWidth
Powyżej muszą być ustawione podczas viewDidLoad aby zapobiec nikomu zmieniających przyciski Szerokość przed nieruchomość jest dostępna.
2. Wszędzie gdzie indziej
W przeważającej części należy unikać opcji niejawnie nieopakowanych, ponieważ jeśli zostanie użyte błędnie, cała aplikacja ulegnie awarii, gdy będzie do niej dostęp nil
. Jeśli nie masz pewności, czy zmienna może być zerowa, zawsze domyślnie używaj normalnej Opcjonalnej. Rozpakowanie zmiennej, która z nil
pewnością nigdy nie jest bardzo bolesna.
if someOptional
.