代码之家  ›  专栏  ›  技术社区  ›  Tometoyou

如何运行一系列函数,如果其中一个函数执行,则返回

  •  0
  • Tometoyou  · 技术社区  · 6 年前

    我在PrepareForSegue函数中初始化容器视图控制器,如下所示:

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        initialiseTopViewController(for: segue)
        initialiseMessagesViewController(for: segue)
        initialiseToolbarViewController(for: segue)
        initialiseTicketViewController(for: segue)
    }
    

    由于 guard SEgue标识符上的条件。我如何才能使它这样做:如果其中一个函数执行,它就不会继续尝试执行其他函数?有比单纯使用更好的方法吗 if...else if 阻碍

    4 回复  |  直到 6 年前
        1
  •  1
  •   Gereon    6 年前

    类似于@rob mayoff的建议,让每个函数返回 Bool 循环通过一个包含所有这些元素的数组,使其完全由数据驱动。

    func prepare(for segue: UIStoryboardSegue, sender: Any?) {
       let funs = [ initialiseTopViewController(for:), 
                    initialiseMessagesViewController(for:), 
                    initialiseToolbarViewController(for:), 
                    initialiseTicketViewController(for:) ]
    
       for fun in funs {
           if fun(segue) {
               break
           }
       }
    }
    
        2
  •  1
  •   rob mayoff    6 年前

    一个解决方案是 initialise 函数返回 true 如果它处理信号,否则 false . 然后:

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        _ = (false
            || initialiseTopViewController(for: segue)
            || initialiseMessagesViewController(for: segue)
            || initialiseToolbarViewController(for: segue)
            || initialiseTicketViewController(for: segue)
        )
    }
    
    private func initialiseTopViewController(for segue: UIStoryboardSegue) -> Bool { ... }
    private func initialiseMessagesViewController(for segue: UIStoryboardSegue) -> Bool { ... }
    private func initialiseToolbarViewController(for segue: UIStoryboardSegue) -> Bool { ... }
    private func initialiseTicketViewController(for segue: UIStoryboardSegue) -> Bool { ... }
    

    另一种解决方案是将适当的测试提升到 prepare(for:sender:) ,例如使用 switch :

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        switch (segue.identifier ?? "", segue.destination) {
            case (_, let dest as TopViewController): initialiseTopViewController(dest)
            case (_, let dest as MessagesViewController): initialiseMessagesViewController(dest)
            case ("toolbar", let dest as MultipurposeViewController): initialiseToolbarViewController(dest)
            case ("ticket", let dest as MultipurposeViewController): initialiseTicketViewController(dest)
            default: super.prepare(for: segue, sender: sender)
        }
    }
    
    private func initialiseTopViewController(_ controller: TopViewController) { ... }
    private func initialiseMessagesViewController(_ controller: MessagesViewController) { ... }
    private func initialiseToolbarViewController(_ controller: MultipurposeViewController) { ... }
    private func initialiseTicketViewController(_ controller: MultipurposeViewController) { ... }
    
        3
  •  0
  •   Rob Md Fahim Faez Abir    6 年前

    我建议一个 switch 检查/强制转换的语句 destination 对于各种类型,并将该类型值传递给适当的方法:

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        switch segue.destination {
        case let destination as FooViewController: prepare(destination)
        case let destination as BarViewController: prepare(destination)
        case let destination as BazViewController: prepare(destination)
        default: super.prepare(for: segue, sender: sender)
        }
    }
    
    func prepare(_ destination: FooViewController) {
        destination.foo = foo
    }
    
    func prepare(_ destination: BarViewController) {
        destination.bar = bar
    }
    
    func prepare(_ destination: BazViewController) {
        destination.baz = baz
    }
    

    这个 转换 只调用适当的方法并保存这些独立的方法,而不需要执行任何 guard 声明。

        4
  •  0
  •   hackerman58888    6 年前

    我想添加到@rob mayoff的解决方案中,使函数返回 bool

    // make each function return boolean values so you know if it executed properly or not based on the return value
    func initialiseTopViewController(for segue: UIStoryboardSegue) -> Bool { ... }
    func initialiseMessagesViewController(for segue: UIStoryboardSegue) -> Bool { ... }
    func initialiseToolbarViewController(for segue: UIStoryboardSegue) -> Bool { ... }
    func initialiseTicketViewController(for segue: UIStoryboardSegue) -> Bool { ... }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // if any function returns true, then return and don't run the remaining functions
        if initialiseTopViewController(for: segue) { return }
        if initialiseMessagesViewController(for: segue) { return }
        if initialiseToolbarViewController(for: segue) {return }
        if initialiseTicketViewController(for: segue) { return }
    }
    

    如果这和其他建议类似,我很抱歉。我只是想向您展示如何使用内联if语句轻松实现。