为什么在使用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/

10-10 20:43