斯威夫特:为什么我还需要选项?

时间:2015-03-15 16:40:05

标签: ios swift optional

我已经阅读了一些关于它的文章并理解了基本原则并且同意它在某些情况下可能有用。但是,大部分时间我都希望我的程序崩溃,如果我在某个地方nil得到我不应该 - 那就是我知道有什么问题!

此外,我读过使用选项可以缩短代码..这怎么可能?从我所看到的背后的整个想法是他们可以有一个值或nil所以你必须做额外的检查,而以前这是不必要的!

还有什么需要使用" as"每时每刻?它只是让一切都变得冗长冗长。例如,比较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];
  

夫特:

//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
);

我做错了吗?或者这真的是它的目的吗?

1 个答案:

答案 0 :(得分:2)

<强>选配

如果您确定某个变量从不为零,则可以使用!强行打开可选项,或使用String!声明隐式解包。当它为零时,这将导致崩溃,完全符合您的要求。

但是,对于一些变量,它们合理是零。例如,User模型的age变量未设置,因为用户没有提供它。

明确地将它们标记为可选,并使用if let展开它们会强制您考虑可空性。最后,这会创建更强大的代码。

我认为这不会导致代码短缺。在Objective-C中你可以使用if var != nil在Swift中使用if let var = var。在Obj-C中向nil发送消息是一个noop,您可以使用var?.method()在Swift中获得相同的行为。最后它有点相同。

投射(as)

你现在需要在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);
    }
}