Swift类型转换示例但使用类

时间:2017-02-15 22:14:41

标签: ios swift

我是编程新手,我正在学习有趣的教程,以便更详细地了解事情。我正在阅读的教程创建了采用Double和Int类型并将它们相乘的代码。众所周知,他们将Int转换为Double来执行操作。以下是示例代码:

let hourlyRate: Double = 19.5
let hoursWorked: Int = 10
let totalCost: Double = hourlyRate * Double(hoursWorked)

看到这个之后我说好的很酷,所以让我看看我是否可以在我正在研究的激情项目中做到这一点。在激情项目代码中,我使用了一个返回UIViewController的UIStoryboard方法,所以我认为如果我可以在下面的代码中使用名为controller的变量做同样的教程,那将会很有趣:

class ItemListDataProviderTests: XCTestCase {

    var controller: ItemListViewController!
    var sut: ItemListDataProvider!
    var tableView: UITableView!


    override func setUp() {
        super.setUp()

        sut = ItemListDataProvider()

        sut.itemManager = ItemManager()

        let storyboard = UIStoryboard.init(name: "Main", bundle: nil)

        controller = storyboard.instantiateViewController(withIdentifier: "ItemListViewController") as! ItemListViewController //compiles

        controller = ItemListViewController(storyboard.instantiateViewController(withIdentifier: "ItemListViewController")) //causes error and code doesn't compile

        _ = controller.view

        tableView = controller.tableView

        tableView.dataSource = sut

    }

正如你所看到的,它没有按照我希望的方式运作。我觉得类型转换是一个额外的步骤,但我发现有必要使代码编译,但我不明白为什么这不起作用。计算机认为我要求它做什么让它不明白?我真的很想知道并理解为什么所以非常感谢任何帮助。

3 个答案:

答案 0 :(得分:3)

Double有一个init方法,它以Int作为参数,因此你可以编写Double(intValue)。你不能用上面的ViewController类做到这一点,因为没有init采用其他类型,实际上你不想创建一个新实例,你想说'这个实例实际上是这种类型',并且你使用'就像那样。

答案 1 :(得分:3)

使用以下代码:

ItemListViewController(storyboard.instantiateViewController(withIdentifier: "ItemListViewController"))

您正在尝试将UIViewController的参数传递给ItemListViewController的构造函数。没有这样的构造函数。

此外,通过从故事板中实例化视图控制器,您将获得已经加载到内存中的视图控制器的实例。所以没有必要像你一样实例化另一个

正确的方法是使用as!操作员就像你之前在线上一样。

答案 2 :(得分:2)

我不确定你要对controller = ItemListViewController(storyboard.instantiateViewController(withIdentifier: "ItemListViewController"))做什么,但这既错又不必要。在上面的行中,您正确地实例化viewController并将其分配给controller变量。在这一行,你似乎试图再次做同样的事情,但以不同的方式。它失败的原因是我假设你没有ItemListViewController的初始值设定项,它将UIViewController作为唯一的参数,这就是你要求它做的事情。如果我错了,请发布初始化程序的代码,以便我们分析。无论哪种方式,该行完全没必要。删除它,你的代码应该编译。