gpt4 book ai didi

ios - 为什么在 instantiateViewController(withIdentifier :) in Swift) 之后需要向下转换

转载 作者:搜寻专家 更新时间:2023-11-01 05:56:27 25 4
gpt4 key购买 nike

为什么我们需要在使用 UIStoryboard 的 instantiateViewController(withIdentifier:) 方法实例化 View Controller 之后使用关键字进行向下转型,以便访问 View Controller 的属性? UIStoryboard 方法 instantiateViewController(withIdentifier:) 已经返回一个 UIViewController 并且知道基于 Storyboard 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(您的特定子类的基类),因此无法知道特定于您的子类的实现细节。

上面提到的方法不会根据 Storyboard ID 推断您的子类类型,这是您在向下转型时在代码中做的事情(参见 here)。

func instantiateViewController(withIdentifier identifier: String) -> UIViewController

之所以有效,是因为您从上面的方法中获取了一个 UIViewController,然后强制将其向下转换为您的 ItemListViewController(它始终有效,因为您定义了 ItemListViewController 作为 UIViewController 子类)。

附言。不过,我不确定我是否理解您的问题,这看起来很简单。

关于ios - 为什么在 instantiateViewController(withIdentifier :) in Swift) 之后需要向下转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41469304/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com