Swift: зачем мне нужны дополнительные опции?

Я прочитал несколько статей об этом и понял основной принцип и согласен с тем, что он может быть полезен в некоторых случаях. Тем не менее, большую часть времени я хотел бы, чтобы моя программа потерпела крах, если я получаю nil где-то, чего мне не должно быть – вот как я знаю, что была проблема!

Кроме того, я читал, что использование опций может привести к сокращению кода. Как это возможно? Из того, что я видел всю идею позади них, они могут либо иметь значение, либо nil поэтому вам нужно делать дополнительную проверку, тогда как раньше это не было необходимо!

И что с необходимостью использовать «как» все время? Это просто делает все более многословным и продолжительным. Например, сравните следующий код в Objective-C и Swift

Objective-C:

 UIViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"Home"]; AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; appDelegate.window.rootViewController = vc; [UIView transitionWithView:appDelegate.window duration:0.2 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{ appDelegate.window.rootViewController = vc; } completion:nil]; 

Swift:

 //have to check if self.storyboard != nil let viewController:UIViewController = self.storyboard?.instantiateViewControllerWithIdentifier("Home") as UIViewController; //Isn't the view controller returned by instantiateViewControllerWithIdentifier() already of type UIViewController? let appDelegate:AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate; //Isn't the delegate returned by sharedApplication() already of type AppDelegate? //have to check if appDelegate.window != nil appDelegate.window!.rootViewController = viewController as UIViewController; //Why cast viewController as UIViewController if the type has already been explicitly set above? UIView.transitionWithView( appDelegate.window!, duration: 0.2, options: UIViewAnimationOptions.TransitionCrossDissolve, animations:{appDelegate.window!.rootViewController = viewController as UIViewController}, completion: nil ); 

Я делаю что-то неправильно? Или это действительно так, как предполагалось?

Optionals

Если вы точно знаете, что переменная никогда не будет нулевой, вы можете принудительно развернуть ее ! или объявить как неявно развернутым с помощью String! , Это приведет к сбою, когда он равен нулю, точно так же, как вы хотите.

Но, с некоторыми переменными, для них разумно быть нулевым. Например, модель User , age переменная которой не задана, поскольку пользователь ее не предоставил.

Явно отмечаю их как необязательные и разворачивающие их, if let вы if let задуматься об нулевой. В итоге это создает более надежный код.

Я не думаю, что это приводит к сокращению кода. Где в Objective-C вы использовали if var != nil вы используете, if let var = var в Swift. Отправка сообщения в nil в Obj-C является noop, вы можете получить то же поведение в Swift, используя var?.method() . В конце концов, это одно и то же.

Кастинг (как)

Большая причина, по которой вам нужны броски прямо сейчас в Swift, – это то, что некоторые методы Objective-C возвращают id , что не было проблемой в Obj-C, но вызывает проблемы в Swift. Я ожидаю, что это уменьшится по мере того, как Swift станет более популярным и адаптируются каркасы.

Обновленный код

Я быстро просмотрел ваш код и, похоже, вам не нужна половина этих призов. Это от верхней части головы:

 if let viewController = self.storyboard?.instantiateViewControllerWithIdentifier("Home") as? UIViewController { if let window = UIApplication.sharedApplication().delegate?.window { window.rootViewController = viewController UIView.transitionWithView(window, duration: 0.2, options: .TransitionCrossDissolve, animations: { window.rootViewController = viewController }, completion: nil); } } 
  • Невозможно передать значение типа Swift._EmptyArrayStorage в 'NSMutableArray' в iOS 11, Xcode 9
  • CIGaussianBlur берет слишком много обработки
  • Простая анимация, если приложение запускается в первый раз?
  • Как растянуть представление, когда табуляция скрыта
  • Как добавить кнопку в ячейку коллекции
  • Громкость сбрасывается для разных аудиозаписей - ios swift
  • iOS - Непосредственный переход с нижней стороны
  • iOS Swift 2.0 - AvAudioPlayer не воспроизводит звук
  • Отключить UIButton с textFieldDidBeginEditing требует нажатия на UITextField для вступления в силу
  • AVAudioSession никогда не останавливался
  • простые данные изображения, передаваемые из представления коллекции, чтобы просмотреть сбой контроллера
  • Давайте будем гением компьютера.