为什么在使用UIStoryboard的instantiateViewController(withIdentifier:)
方法实例化视图控制器之后,需要使用关键字进行下调,以便可以访问视图控制器的属性? UIStoryboard方法instantiateViewController(withIdentifier:)
已经返回了UIViewController
并知道基于故事板ID 的哪个类,或者这是我假设发生的事情,但并非完全正确。
以下代码可以工作并编译,但我想了解原因。如果我根据文档进行构建,则不会以为需要进行向下转换,因此我试图弄清关于从函数返回的类型和/或对象我还没有学到或理解的部分。
func test_TableViewIsNotNilOnViewDidLoad() {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = storyboard.instantiateViewController(
withIdentifier: "ItemListViewController")
let sut = viewController as! ItemListViewController
_ = sut.view
XCTAssertNotNil(sut.tableView)
}
最佳答案
因为storyboard.instantiateViewController...
始终返回UIViewController(您的特定子类的基类),因此无法知道特定于您的子类的实现详细信息。
上面提到的方法不会基于情节提要ID推断您的子类类型,这是您在向下转换时在代码中执行的操作(请参阅here)。
func instantiateViewController(withIdentifier identifier: String) -> UIViewController
之所以起作用,是因为您从上述方法中获得了
UIViewController
,然后将其强制向下转换为ItemListViewController
(它始终有效,因为您将ItemListViewController
定义为UIViewController
子类)。PS。我不确定我是否理解您的问题,这似乎很简单。
关于ios - 为什么在Swift中实例化ViewController(withIdentifier :)之后需要向下转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41469304/