var terms = [Privacy(), Search(), Stores()]
这些类中的每一个都有自己的trackScreen(),trackBanners()等实现,
目前在具有调用每个类的trackScreen()等实现的函数的类中,
func trackScreen(screenName: String) {
for term in terms {
term.trackScreen(screenName)
}
}
func trackBanner(banner: UIImage) {
for term in terms {
term.trackBanner(banner)
}
}
我如何不为每个函数重复“for term of terms”,但是仍然让每个术语都调用它们自己的那些方法的实现?
答案 0 :(得分:0)
如果您希望每种方法转发呼叫,则需要编写for
&#39}。你无法摆脱一些"重复的"代码,如果要将操作转发到数组的内容。但是,您可以使用forEach
:
func trackScreen(screenName: String) {
terms.forEach { $0.trackScreen(screenName) }
}
func trackBanner(banner: UIImage) {
terms.forEach { $0.trackBanner(banner) }
}
您可以通过在Sequence
上添加扩展程序来进一步提升:
extension Sequence {
func perform<T>(_ arg: T, _ f: (Element) -> (T) -> Void) -> Void {
forEach { f($0)(arg) }
}
}
,并在您的方法中使用它:
func trackScreen(screenName: String) {
terms.perform(screenName, BaseClass.trackScreen }
}
func trackBanner(banner: UIImage) {
terms.perform(screenName, BaseClass.trackBanner }
}
,但与第一种显式方法相比,这并没有太大的好处,而且您仍然有重复的代码 - perform
来电。
基本上如果你需要在不同的地方进行相同的操作,不同的上下文,那么你会遇到一些代码重复,你不能避免这种情况。