【问题标题】:Using functional programming to map one array to another使用函数式编程将一个数组映射到另一个数组
【发布时间】:2017-03-02 11:40:55
【问题描述】:

我可以使用什么函数式编程函数(map、reduce、zip)来替换这个for 循环的功能? (数组有不同的对象,但元素数量相同)

@IBOutlet var imageViews: [UIImageView]!
photoURLs = ["http://...photo1...", "http://...photo2...", "http://...photo3..."]

for (index, photo) in photoURLs.enumerated() {
    imageViews[index].setImageFromString(string: photo.urlString)
}

更新:大多数 cmets / 答案都适用于我提出的这个问题的第一个版本。现在,我用我的具体案例对其进行了修改。

关于重复问题:这个问题不涉及合并两个数组,它是指将值从一个数组复制到另一个数组,完全相同的索引,但也可以通过自定义方法将它们放入。

【问题讨论】:

  • @Adolfo - 请发表您的评论作为答案。这是正确的答案!
  • 你不是说array2(又名imageViews)是空的吗?如果您尝试使用空数组下标的结果调用方法,您将有非常糟糕的时间。
  • @Teodor Ciuraru 你能发布你的实际代码而不是伪代码吗?包括你想在你的数组元素上调用的函数
  • @TeodorCiuraru, imageViews[index] where imageViews == [](即使不是nil)会导致崩溃,所以你会玩得很糟糕。

标签: swift


【解决方案1】:

假设两个数组都应该包含相同的元素...

let array2 = firstArray

【讨论】:

  • 这是我之前问的正确答案。谢谢你。但我发现我的问题比这有点复杂,我更新了问题。
【解决方案2】:

我无法测试我的代码,但可能是...

self.imageViews = photoURLs.map()
{ 
    guard let data = NSData(contentsOf: $0), let image = UIImage(data: data)
    {
        return UIImageView(image: nil)
    }

    return UIImageView(image: image)
)

假设 photoURLs 是一个URL 数组。

【讨论】:

  • 谢谢,阿道夫。万分感激。你们帮我满足了我的好奇心。
【解决方案3】:

你可以试试这样的:

zip(imageViews, photoURLs)
    .forEach { $0.setImageFromString(string: $1.urlString) }

详细示例:

let views = ["View0", "View1", "View2"]
let urls = ["url0", "url1", "url2"]

zip(views, urls)
    .forEach { print("View: \($0), URL: \($1)") }

// Result: 
View: View0, URL: url0
View: View1, URL: url1
View: View2, URL: url2

【讨论】:

【解决方案4】:
let flatMappedNumbers = firstArray.flatMap { $0 }
print(flatMappedNumbers)

【讨论】:

  • 为什么在这里使用flatMap
  • 它忽略 nil。
  • 如果 OP 需要保留他的 nils 怎么办?
  • 让 flatMappedNumbers = firstArray.map { $0 }
  • @BohdanSavych,什么?如果我在map 上面说[Int]Int -> Int 函数,我会神奇地得到[Int?] 什么的?
猜你喜欢
  • 2015-07-14
  • 2017-05-26
  • 1970-01-01
  • 2021-08-30
  • 1970-01-01
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多