Прочетох няколко статии за това и разбирам основния принцип и съм съгласен, че може да бъде полезно в някои случаи. През повечето време обаче бих искал програмата ми да се срине, ако получавах nil
някъде, където не би трябвало да бъда -- така разбрах, че има проблем!
Освен това прочетох, че използването на опции може да доведе до по-кратък код. Как е възможно това?? От това, което съм виждал, цялата идея зад тях е, че те могат или да имат стойност, или nil
, така че трябва да направите допълнителна проверка, докато преди това не беше необходимо!
И какво става с необходимостта да използвате "като" през цялото време? Това просто прави всичко по-многословно и дълго. Например, сравнете следния код в Objective-C и Swift
Обектив-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
);
Правя ли нещо нередно? Или това наистина е начинът, по който е планирано да бъде?
nil
, но с цената на това, че трябва винаги да проверявате заnil
? Изглежда ми като много повече код - person null pointer exception   schedule 15.03.2015respondsToSelector:
проверки на извикванията на методите и свойствата достъп. - person Mick MacCallum   schedule 15.03.2015