概括多个for循环

时间:2018-03-30 17:10:32

标签: arrays swift for-loop

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”,但是仍然让每个术语都调用它们自己的那些方法的实现?

1 个答案:

答案 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来电。

基本上如果你需要在不同的地方进行相同的操作,不同的上下文,那么你会遇到一些代码重复,你不能避免这种情况。