forEach 在 nslaoyutconstraints 中的使用

Posted

技术标签:

【中文标题】forEach 在 nslaoyutconstraints 中的使用【英文标题】:forEach use in nslaoyutconstraints 【发布时间】:2020-12-16 00:30:16 【问题描述】:

我希望我的 swift 代码查看在创建约束时是否可以使用类似于 for Each 循环的方法。现在代码无法编译。在正常设置中,$0 是 b4。如果我可以做这样的事情,如果我必须为多个对象执行此操作,我的编码效率会大大提高。

           NSLayoutConstraint.activate([
     [b4].forEach( 
       


        $0.topAnchor.constraint(equalTo: colorLbl.bottomAnchor),
        $0.leadingAnchor.constraint(equalTo: b3.trailingAnchor),
        $0.heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.10),
        $0.widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: 0.25)

           )

           ])

编辑一些不工作的东西

   NSLayoutConstraint.activate([
      [b4].flatMap  [
          textBox.topAnchor.constraint(equalTo: view.topAnchor),
        textBox.leadingAnchor.constraint(equalTo: view.leadingAnchor),
        textBox.heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.08),
        textBox.widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: 1),

            $0.topAnchor.constraint(equalTo: colorLbl.bottomAnchor),
            $0.leadingAnchor.constraint(equalTo: undo.trailingAnchor),
            $0.heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.10),
            $0.widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: 0.25)

        ] 
    
    ])

【问题讨论】:

【参考方案1】:

您可以使用flatMap。例如,如果你想给b4b5b6添加相同的约束:

NSLayoutConstraint.activate(
    [b4, b5, b6].flatMap  [

        $0.topAnchor.constraint(equalTo: colorLbl.bottomAnchor),
        $0.leadingAnchor.constraint(equalTo: b3.trailingAnchor),
        $0.heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.10),
        $0.widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: 0.25)

    ] 
)
// call "activate" again to do the other constraints
NSLayoutConstraint.activate([
        textBox.topAnchor.constraint(equalTo: view.topAnchor),
        textBox.leadingAnchor.constraint(equalTo: view.leadingAnchor),
        textBox.heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.08),
        textBox.widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: 1),
    ])

如果你使用+,你也可以只打一个电话activate,但我觉得这很难阅读:

NSLayoutConstraint.activate(
    [b4, b5, b6].flatMap  [

        $0.topAnchor.constraint(equalTo: colorLbl.bottomAnchor),
        $0.leadingAnchor.constraint(equalTo: b3.trailingAnchor),
        $0.heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.10),
        $0.widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: 0.25)

    ] 
    + [ // here!
        textBox.topAnchor.constraint(equalTo: view.topAnchor),
        textBox.leadingAnchor.constraint(equalTo: view.leadingAnchor),
        textBox.heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.08),
        textBox.widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: 1),
    ]
)

或者,使用常规的for 循环并多次调用NSLayoutConstraint.activate这并没有错

for b in [b4, b5, b6] 
    NSLayoutConstraint.activate([
        b.topAnchor.constraint(equalTo: colorLbl.bottomAnchor),
        b.leadingAnchor.constraint(equalTo: b3.trailingAnchor),
        b.heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.10),
        b.widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: 0.25)
    ])

NSLayoutConstraint.activate([
        textBox.topAnchor.constraint(equalTo: view.topAnchor),
        textBox.leadingAnchor.constraint(equalTo: view.leadingAnchor),
        textBox.heightAnchor.constraint(equalTo: view.heightAnchor,multiplier: 0.08),
        textBox.widthAnchor.constraint(equalTo: view.widthAnchor,multiplier: 1),
    ])

但是,如果您要将相同的约束添加到一堆视图中,它们将完全相互重叠。

您可能希望将这些视图水平放置在一条线上。我会为此使用UIStackView,而不是手动添加约束。

let stackView = UIStackView(arrangedStackViews: [b3, b4, b5, b6])
stackView.axis = .horizontal

然后您可以向堆栈视图添加约束,并尝试使用 distributionalignment 属性来获得所需的结果。

【讨论】:

您的第一个示例似乎不起作用它导致此错误无法将类型“[NSLayoutConstraint]”的值转换为预期的元素类型“Array.ArrayLiteralElement”(又名“NSLayoutConstraint”) flatMap 线 @joebuck 请再次阅读代码。您可能在外面添加了一些额外的[] 我明白你在说什么,我的 nslaout 约束就像 NSLayoutConstraint.activate([。我需要它来处理其他约束。 什么意思?你可以编辑你的问题来说明吗? @joebuck @joebuck 我知道你有activate([。我想让你解释为什么你需要([。 “其他约束”是什么意思?您不能通过再次调用activate 来添加其他约束吗?

以上是关于forEach 在 nslaoyutconstraints 中的使用的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis 中 foreach 用法

在foreach内淘汰foreach

foreach双重循环怎么在ThinkPHP模板中输出

C#中foreach语句的作用?

详细讲解foreach循环的用法

Java的foreach怎么用?