我有两个几乎完全相同的函数,我想将它们合并为一个,但我无法找到如何在if-let语句中处理类型转换。我只能想到两个解决方案,但我无法执行其中任何一个。
以下是两个函数(对它们来说还有很多,但这是导致我在合并中遇到麻烦的唯一部分):
func loadNextEventViewController() {
if let nextEventViewController = storyboard?.instantiateViewController(withIdentifier: "EventViewController") as? EventViewController {
// Executed code in here
}
}
func loadFinishViewController() {
if let finishViewController = storyboard?.instantiateViewController(withIdentifier: "FinishViewController") as? FinishViewController {
// Executed code in here
}
}
我的第一次尝试是创建一个可以接受EventViewController或FinalViewController的泛型参数,但据我所知,泛型参数没有逻辑OR,只有逻辑AND。
我的第二次尝试是创建一个计算机变量,但这也不起作用。
如何在我的函数调用中使用一个参数,我可以将其转换为if-let块中的类类型?
实施例:
func loadViewController(identifier: String, viewControllerType: UIViewController)
我通过使用in-else语句以非常笨重的方式解决了这个问题,但我想找到一种更优雅的方法来解决这个问题。
答案 0 :(得分:0)
你可以这样做
func load(_ viewController: UIViewController) {
if viewController is EventViewController {
//do stuff
}
if viewController is FinishViewController {
//do stuff
}
//do stuff that applies to all types of view controllers
}
然后这样称呼:
let eventVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("EventViewController")
load(eventVC)
如果你想避免使用if语句,你可以使用switch语句,如下所示:
func load(_ viewController: UIViewController) {
switch viewController {
case is EventViewController:
//do stuff for EventViewController
case is FinishViewController:
//do stuff for FinishViewControllers
default:
//do stuff for other types, or break
}
//do stuff that applies to all viewControllers
}
答案 1 :(得分:0)
这不是铸造的问题..在你的应用程序中你有两个选择,移动到一个vc或另一个。可能有很多逻辑做出这个决定。但无论哪种方式,都要在VC上展示出什么样的决定。你只需要决定做出这个决定的最佳地点。
根据您目前所展示的内容,您可以这样做:
func showController(identifier: String) {
if let vc = storyboard?.instantiateViewController(withIdentifier: identifier) as? UIViewController {
// Executed code in here
}
}
我认为,每条路线都有不同的动作需要不同的处理。这里最常用的方法是使用segue,然后您可以使用prepareForSegue根据segue标识符捕获segue并根据需要设置属性。如果您能提供更多信息,我可以提供更好的答案。
你需要考虑的主要事情是......两者之间究竟有什么不同。确定这一点,你可以重构代码以减少重复
答案 2 :(得分:0)
你可以这样做
var main = this;
main.show = true;
$http({
method: 'GET',
url: 'url'
})
.then(function(res) {
main.show = true;
console.log('succeed call, main.show: ' + main.show);
}, function(res) {
main.show = false;
console.log('failed call, main.show: ' + main.show);
DoSomething();
});
function DoSomething(){
console.log('out of call, main.show: ' + main.show);
}