Ios 为什么InstanceViewControllerWithiIdentifier需要使用;作为&引用;

Ios 为什么InstanceViewControllerWithiIdentifier需要使用;作为&引用;,ios,swift,Ios,Swift,为什么我们需要使用“as!DataEntryViewController” 当我使用xcode 7.3.1将其取出时,它就可以工作了 是的,您可以实例化视图控制器,而不必关心它是UIViewController的哪个子类。从该方法返回的对象将是一个视图控制器,因此使用它可以安全地对所有视图控制器执行操作:以模式显示它,将它推到导航控制器上,将它添加到选项卡控制器上,等等 但是,如果要对它执行特定于视图控制器类的操作,例如ifSomethingViewController定义了一个属性,该属性允许

为什么我们需要使用“as!DataEntryViewController”

当我使用xcode 7.3.1将其取出时,它就可以工作了

是的,您可以实例化视图控制器,而不必关心它是
UIViewController
的哪个子类。从该方法返回的对象将是一个视图控制器,因此使用它可以安全地对所有视图控制器执行操作:以模式显示它,将它推到导航控制器上,将它添加到选项卡控制器上,等等

但是,如果要对它执行特定于视图控制器类的操作,例如if
SomethingViewController
定义了一个属性,该属性允许您选择它显示的
内容,并且您希望将其指定给该属性,那么您需要做两件事:

  • 在运行时测试您从
    instantialeviewcontrollerwhiteIdentifier
    返回的对象是否是您期望的类。(因为根据传递的标识符,它可能是其他类,如果该标识符不在情节提要中,则可能什么都没有。)
  • 让编译器知道您分配给该对象的变量是该类的类型化变量,以便编译器允许您访问该类的属性和调用该类的方法 带有
    as?
    as的作业强制转换在一个步骤中完成这两件事。(是使用
    作为?
    还是
    作为!
    取决于您对自己的信任程度,以确保您的故事板标识符与它们声称的一样,以及您希望如何处理此类假设的失败。)


    事实上,即使您没有使用特定于该视图控制器类的属性或方法,
    强制转换添加运行时检查,以确保视图控制器类是您所期望的。因此,当你取出石膏时,没有任何东西断裂的事实并不是石膏是多余的——这是一个迹象,表明石膏检查的任何断裂目前都没有发生

    也就是说,如果有人更改了您的故事板,使标识符“某物”位于
    SomethingElseViewController
    上,您引用的这句话将导致崩溃。如果你把那个人赶出去,你就不会在那里撞车了。(你以后可能会遇到麻烦。)

    但是,如果您真正想做的是维护故事板和程序的有效性,那么最好弄清楚这一点:

    let someVC  = self.storyboard!.instantiateViewControllerWithIdentifier("something") as! SomethingViewController
    

    如果没有它也能工作,那么你就不需要它了。
    let someVC  = self.storyboard!.instantiateViewControllerWithIdentifier("something")
    assert(someVC is SomethingViewController)
    // then do something non-SomethingViewController-specific with it