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