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