首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何运行一系列函数,如果其中一个函数执行,则返回

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

Stack Overflow用户
提问于 2018-11-28 15:08:43
回答 4查看 83关注 0票数 0

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

代码语言:javascript
复制
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    initialiseTopViewController(for: segue)
    initialiseMessagesViewController(for: segue)
    initialiseToolbarViewController(for: segue)
    initialiseTicketViewController(for: segue)
}

由于segue标识符上的guard条件,这些函数中只有一个实际上将在每个segue上运行。如果其中一个函数执行,它就不会继续尝试执行其他函数,我如何才能这样做呢?有比仅仅使用if...else if块更好的方法吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-11-28 15:21:19

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

代码语言:javascript
复制
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
       }
   }
}
票数 1
EN

Stack Overflow用户

发布于 2018-11-28 15:17:46

一种解决方案是使每个initialise函数在处理segue (否则为false )时返回true。然后:

代码语言:javascript
复制
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

代码语言:javascript
复制
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) { ... }
票数 1
EN

Stack Overflow用户

发布于 2018-11-28 16:29:57

我建议使用switch语句检查/转换各种类型的destination,并将该类型值传递给适当的方法:

代码语言:javascript
复制
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
}

这个switch只调用适当的方法,并将这些单独的方法从根本上不需要执行任何guard语句。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53522498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档