Я прочитал несколько статей об этом, понял основной принцип и согласен с тем, что в некоторых случаях это может быть полезно. Однако в большинстве случаев я хотел бы, чтобы моя программа падала, если бы я получал nil
где-то, чего не должен был - вот как я узнал, что есть проблема!
Кроме того, я читал, что использование опций может привести к сокращению кода. Как это возможно?? Из того, что я видел, вся идея, стоящая за ними, заключается в том, что они могут иметь либо значение, либо nil
, поэтому вам нужно выполнить дополнительную проверку, тогда как раньше в этом не было необходимости!
А что не так с необходимостью использовать «как» все время? Это просто делает все более многословным и длинным. Например, сравните следующий код в Objective-C и Swift.
Цель-С:
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];
Быстрый:
//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
);
Я делаю что-то неправильно? Или это действительно так, как было задумано?
nil
, но за счет необходимости всегда проверятьnil
? Мне кажется намного больше кода - person null pointer exception   schedule 15.03.2015respondsToSelector:
проверяет вызовы методов и свойства доступ. - person Mick MacCallum   schedule 15.03.2015