使用变量在Swift 3中键入强制转换

时间:2017-03-11 00:49:52

标签: ios swift function generics casting

我有两个几乎完全相同的函数,我想将它们合并为一个,但我无法找到如何在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语句以非常笨重的方式解决了这个问题,但我想找到一种更优雅的方法来解决这个问题。

3 个答案:

答案 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);
}