自定义Swift函数有错误

时间:2017-10-16 13:05:44

标签: swift

我已经制定了下面的功能,以便我可以在我的ios应用程序中重复使用它。但是,我无法构建我的应用程序,因为我的函数下面有错误指示给我,但我看不出它有什么问题。该功能旨在将用户移动到ios应用程序中的新页面。有人可以建议吗?

return this;

2 个答案:

答案 0 :(得分:1)

您的函数需要类型为UIViewController的返回值,并且不返回任何内容。因此,要么返回您创建的实例(如果需要)。或者删除返回值。

您的功能与泛型的略有修改,可以满足您的需求。函数前的@discardableResult字告诉编译器可以省略结果。

@discardableResult
func goToPage<T>(goto storyBoardId: String,
                 ofType typeUIViewController: T.Type) -> T
    where T: UIViewController {

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let newPage = storyboard.instantiateViewController(withIdentifier: storyBoardId) as! T
    self.present(newPage, animated: true, completion: nil)

    return newPage
}

<强> USAGE

// Ignore return value
goToPage(goto: "Page", ofType: ViewController.self)

// Preserve return value:
// Thanks to generics, page and page2 types are inferred by the compiler
// page is CustomController and page2 is LoginController
// and you can access corresponding interface:
var page = goToPage(goto: "Page", ofType: CustomController.self)
var page2 = goToPage(goto: "Page", ofType: LoginController.self)

<强>更新

我看到Honey提出了正确的想法,但是类型转换的问题仍然存在。原因是编译器不知道typeUIViewController是什么类型的。实际上,它实际上甚至不是一个类型,它只是变量的内部名称。并且编译器无法推断它的类型(与as运算符一起使用)。因此,实现你正在尝试的东西的正确方法之一是使用泛型。将泛型T视为满足特定条件的模式。

答案 1 :(得分:0)

您需要将UIViewController更改为UIViewController.Type。有关详情,请参阅here

因为UIViewController的参数可以接受UIViewController 实例,例如UIViewController()。但是,您需要获取其类型信息(您不需要实例),因此它必须是UIViewController.Type类型的参数,因此您传递的值可能类似于SomeUIViewControllerSubclass.self这不是一个实例...

所以你必须这样做:

 func goToPage(goto storyBoardId: String, ofType typeUIViewController: UIViewController.Type) -> UIViewController {
    let storyBoard: UIStoryboard = UIStoryboard.init(name: "Main", bundle: nil)
    let newPage = storyBoard.instantiateViewController(withIdentifier: storyBoardId) as! typeUIViewController
    self.present(newPage, animated: true, completion: nil)
}