假设我正在使用UICollectionView制作可滚动页面。这些页面都是不同的,并由一个页面数组填充,如下所示:
let pages = [GreenPage(), YellowPage(), OrangePage(), YellowPage(), GreenPage()]
因此,为了清楚起见,页面将是绿色,然后是黄色,然后是橙色...
[现在,让我说,使它被点击时,它运行一个名为tapped()的函数,该函数出现在每个GreenPage(),YellowPage()和OrangePage()中。
现在,我看到的唯一方法是:
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
if let greenPage = collectionView.cellForItem(at: indexPath) as! GreenPage {
greenPage.tapped()
} else if let yellowPage = collectionView.cellForItem(at: indexPath) as! YellowPage {
yellowPage.tapped()
} else if let orangePage = collectionView.cellForItem(at: indexPath) as! OrangePage {
orangePage.tapped()
}
}
这似乎是多余的。假设每个类的窃听函数都做同样的事情,还有另一种方法吗?谢谢!
这是协议的一个很好的例子。创建它
protocol Tappable {
func tapped()
}
采用协议
class GreenPage : Tappable { ...
class YellowPage : Tappable { ...
class OrangePage : Tappable { ...
这将大大减少didSelectItemAt
中的代码
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let page = collectionView.cellForItem(at: indexPath) as! Tappable
page.tapped()
}