使用 forEach 创建 UIAction

Use forEach for creating UIActions

我想使用 UIMenu 创建一个类似于菜单的过滤器,该菜单将从 UIBarButtonItem

打开
  private func createFilteringMenu() -> UIMenu {
        
        let fivePhotos = UIAction( title: "5", image: UIImage(systemName: "photo")) { [weak self] _ in
            guard let this = self else { return }
            this.fetchImages(limit: 5)
        }


        let tenPhotos = UIAction( title: "10", image: UIImage(systemName: "photo")) { [weak self] _ in
            guard let this = self else { return }
            this.fetchImages(limit: 10)
        }

        let twentyPhotos = UIAction( title: "20", image: UIImage(systemName: "photo")) { [weak self] _ in
            guard let this = self else { return }
            this.fetchImages(limit: 20)
        }

        let thirtyPhotos = UIAction( title: "30", image: UIImage(systemName: "photo")) { [weak self] _ in
            guard let this = self else { return }
            this.fetchImages(limit: 30)
        }
        
    
        
        let menuActions = [fivePhotos, tenPhotos, twentyPhotos, thirtyPhotos]
        let addNewMenu = UIMenu( title: "Select number of photos", children: menuActions)
        
        return addNewMenu
    }

我认为这是非常糟糕的(重复代码太多)。我想通过使用 forEach:

来做到这一点
    private func createFilteringMenu() -> UIMenu {
        
        let numberOfItems = [5, 10, 15, 20, 25, 30]
        var menuActions: [UIAction] = []
        
        numberOfItems.forEach{ index in
            if index < numberOfItems.count {
                let item = UIAction( title: "\(numberOfItems[index])", image: UIImage(systemName: "photo")) { [weak self] _ in
                    guard let this = self else { return }
                    this.fetchImages(limit: numberOfItems[index])
                }
                menuActions.append(item)
            }
        }

        
        let addNewMenu = UIMenu( title: "Select number of photos", children: menuActions)
        
        return addNewMenu
    }

但当然它只是添加了最后一项 (30),谁能帮我添加所有项目(或类似的东西)。

非常感谢

forEach 给出的是值而不是索引。

因此不需要 if 条件,因为它实际上是在每次迭代中根据数组长度检查值

is 5 < 6 -> true
is 10 < 6 -> false
is 15 < 6 -> false
is 20 < 6 -> false
is 25 < 6 -> false
is 30 < 6 -> false

这就是为什么您的菜单中只显示一项的原因

试试这个,看看它是否能解决您的问题。

private func createFilteringMenu() -> UIMenu {
    
    var menuActions: [UIAction] = []
    
    numberOfItems.forEach{ value in
        
        let item = UIAction( title: "\(value)",
                             image: UIImage(systemName: "photo"))
        { [weak self] _ in
            guard let this = self else { return }
            this.fetchImages(limit: value)
        }
    
        menuActions.append(item)
    }
    
    return UIMenu(title: "Select number of photos",
                  children: menuActions)
}