【问题标题】:Generalize multiple for loops泛化多个 for 循环
【发布时间】:2018-03-30 17:10:32
【问题描述】:
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 in terms”,但仍然让每个术语调用自己的这些方法的实现?

【问题讨论】:

  • foreground/background/launch 部分作为单个“跟踪应用事件”函数的参数
  • @Alexander 你能举例说明如何在这里发送一个方法作为参数吗?
  • 这里显示的函数没有结果;那么“在每个函数中使用结果”是什么意思?调用代码是什么样的,您希望它是什么样的?实现这一循环的明显方法是使其成为一个调用.trackAppforegroud(); .trackAppBackground(); .trakAppLaunch() 的循环。那不是你想做的吗?
  • @jayn 我不知道您实际上想要实现什么,因此很难制定解决方案。什么是期限?正在跟踪什么?是否以各种方式跟踪所有条款?这甚至意味着什么?
  • @Alexander Terms 是一个跟踪术语数组,每个跟踪术语都有自己的 trackAppForeground() 等实现,

标签: arrays swift for-loop


【解决方案1】:

如果您希望每个方法都转发呼叫,则需要编写for。如果要将操作转发到数组的内容,则无法摆脱一些“重复”代码。但是,您可以使用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 调用。

基本上如果你需要在不同的地方做同样的操作,不同的上下文,那么你会遇到一些代码重复,这是你无法避免的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-08
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    • 2015-03-10
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多