2017-02-15 25 views
0

我是新来编程,我正在跟随一个教程的乐趣,更详细地了解事情。我正在阅读的教程将创建采用Double和Int类型并将它们相乘的代码。众所周知,他们将Int转换为Double来执行操作。下面是示例代码:Swift类型转换的例子,但使用一个类

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

看到这一点,我说没关系冷静,所以让我看看,如果我能做到这一点的激情项目我工作后。在激情的项目代码我用UIStoryboard方法返回一个UIViewController,所以我认为这将是有趣的,如果我能做到一样,在下面的代码我的变量称为控制器教程:

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

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

2

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

3

有了这行代码:

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

你想的UIViewController的一个参数传递到ItemListViewController的构造。没有这样的构造函数存在。

此外,通过从故事板实例化视图控制器,您将获得已加载到内存中的该视图控制器的实例。所以不需要实例化另一个,因为你正在做

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