创建一个以 UIViewController 作为参数的函数
Create a function that takes a UIViewController as a parameter
我正在尝试创建一个将 UIViewController 作为函数的函数。这样做的原因是它可以传递多个自定义视图控制器。这是我当前的函数,它可以工作,但使用了 switch 语句和枚举:
enum controllerTypes {
case First, Second
}
extension UIViewController {
func presentViewController(storyBoardName: String, storyBoardIdentifier: String, controllerType: controllerTypes, completion:(() -> Void)?) {
switch controllerType {
case .First:
let firstVC = UIStoryboard(name: storyBoardName, bundle: nil).instantiateViewController(withIdentifier: storyBoardIdentifier) as? FirstViewController
if let firVC = firstVC {
self.present(firVC, animated: true, completion: nil)
}
case .Second:
let secondVC = UIStoryboard(name: storyBoardName, bundle: nil).instantiateViewController(withIdentifier: storyBoardIdentifier) as? SecondViewController
if let secVC = secondVC {
self.present(secVC, animated: true, completion: nil)
}
}
completion?()
}
}
我没有为参数传递 'controllerTypes' 枚举,而是想向它传递任何类型的 UIViewController,当我尝试这样做时,出现以下错误:
func presentViewController(storyBoardName: String, storyBoardIdentifier: String, controllerType: UIViewController, completion:(() -> Void)?) {
let sampleVC = UIStoryboard(name: storyBoardName, bundle: nil).instantiateViewController(withIdentifier: storyBoardIdentifier) as? controllerType//error - use of undeclared type 'controllerType'
if let samVC = sampleVC {
self.present(samVC, animated: true, completion: nil)
}
}
知道是否可以这样做吗?
您必须使函数通用,然后转换为通用参数类型:
extension UIViewController {
func presentViewController<T: UIViewController>(storyBoardName: String, storyBoardIdentifier: String, controllerType: T.Type, completion:(() -> Void)?) {
let sampleVC = UIStoryboard(name: storyBoardName, bundle: nil).instantiateViewController(withIdentifier: storyBoardIdentifier) as? T
if let samVC = sampleVC {
self.present(samVC, animated: true, completion: completion)
}
}
}
我正在尝试创建一个将 UIViewController 作为函数的函数。这样做的原因是它可以传递多个自定义视图控制器。这是我当前的函数,它可以工作,但使用了 switch 语句和枚举:
enum controllerTypes {
case First, Second
}
extension UIViewController {
func presentViewController(storyBoardName: String, storyBoardIdentifier: String, controllerType: controllerTypes, completion:(() -> Void)?) {
switch controllerType {
case .First:
let firstVC = UIStoryboard(name: storyBoardName, bundle: nil).instantiateViewController(withIdentifier: storyBoardIdentifier) as? FirstViewController
if let firVC = firstVC {
self.present(firVC, animated: true, completion: nil)
}
case .Second:
let secondVC = UIStoryboard(name: storyBoardName, bundle: nil).instantiateViewController(withIdentifier: storyBoardIdentifier) as? SecondViewController
if let secVC = secondVC {
self.present(secVC, animated: true, completion: nil)
}
}
completion?()
}
}
我没有为参数传递 'controllerTypes' 枚举,而是想向它传递任何类型的 UIViewController,当我尝试这样做时,出现以下错误:
func presentViewController(storyBoardName: String, storyBoardIdentifier: String, controllerType: UIViewController, completion:(() -> Void)?) {
let sampleVC = UIStoryboard(name: storyBoardName, bundle: nil).instantiateViewController(withIdentifier: storyBoardIdentifier) as? controllerType//error - use of undeclared type 'controllerType'
if let samVC = sampleVC {
self.present(samVC, animated: true, completion: nil)
}
}
知道是否可以这样做吗?
您必须使函数通用,然后转换为通用参数类型:
extension UIViewController {
func presentViewController<T: UIViewController>(storyBoardName: String, storyBoardIdentifier: String, controllerType: T.Type, completion:(() -> Void)?) {
let sampleVC = UIStoryboard(name: storyBoardName, bundle: nil).instantiateViewController(withIdentifier: storyBoardIdentifier) as? T
if let samVC = sampleVC {
self.present(samVC, animated: true, completion: completion)
}
}
}