gpt4 book ai didi

ios - 如果对可选的UIViewController数组进行操作,如何避免嵌套过多?

转载 作者:行者123 更新时间:2023-12-01 19:29:30 25 4
gpt4 key购买 nike

我有一个UIPageViewController,它具有一个可选的UIViewController数组。

pageViewController.viewControllers
我注意到,每当我需要对其执行一些操作时,都需要编写 if检查的许多级别(4)。
  // TODO: How can we improve this code?
//
// Logic: We will call setViewControllers, if viewControllers is null, or empty, or 1st element of
// viewControllers.pageIndex is not equal to self.selectedTabIndex
if let viewControllers = self.pageViewController.viewControllers {
if viewControllers.count > 0 {
if let pageIndexable = viewControllers[0] as? PageIndexable {
if pageIndexable.pageIndex != self.selectedTabIndex {
self.pageViewController.setViewControllers([viewController(At: self.selectedTabIndex)!], direction: direction, animated: true, completion: nil)
self.tabCollectionView.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true)
}
}
} else {
self.pageViewController.setViewControllers([viewController(At: self.selectedTabIndex)!], direction: direction, animated: true, completion: nil)
self.tabCollectionView.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true)
}
} else {
self.pageViewController.setViewControllers([viewController(At: self.selectedTabIndex)!], direction: direction, animated: true, completion: nil)
self.tabCollectionView.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true)
}
我觉得由于 if语句级别过多,我可能以错误的方式使用了 可选
您能为我提出一种改进代码的方法吗?

最佳答案

考虑一下您何时不想调用setViewControllers。那是当以下是假的:
viewControllers为nil,或者为空,或者viewControllers[0].pageIndex != self.selectedTabIndex
使用德摩根定律,我们可以看到它的取反是:
viewControllers不为nil,也不为空,并且viewControllers[0].pageIndex == self.selectedTabIndex
在if语句中进行连接,我们得到:

if let vcs = self.pageViewController.viewControllers,
let firstVC = vcs.first as? PageIndexable, // this checks for non-empty
firstVC.pageIndex == self.selectedTabIndex {
// do stuff
} else {
self.pageViewController.setViewControllers([viewController(At: self.selectedTabIndex)!], direction: direction, animated: true, completion: nil)
self.tabCollectionView.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true)
}
// do other stuff
如果该方法将在执行 setViewControllersscrollToItem之后立即返回(即,您在 // do other stuff位置没有任何代码),则可以改用 guard语句:
guard let vcs = self.pageViewController.viewControllers,
let firstVC = vcs.first as? PageIndexable,
firstVC.pageIndex == self.selectedTabIndex else {
self.pageViewController.setViewControllers([viewController(At: self.selectedTabIndex)!], direction: direction, animated: true, completion: nil)
self.tabCollectionView.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true)
return
}
// do stuff
正如亚历山大在 comments中所说的,您也可以在一个表达式中执行此操作:
if !((self.pageViewController.viewControllers?.first as? PageIndexable)?.pageIndex == self.selectedTabIndex) {

self.pageViewController.setViewControllers([viewController(At: self.selectedTabIndex)!], direction: direction, animated: true, completion: nil)
self.tabCollectionView.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true)

}
但是我认为这种方式的意图不太明确。

关于ios - 如果对可选的UIViewController数组进行操作,如何避免嵌套过多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63785806/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com