没有更多上下文,表达式类型是模糊的

时间:2016-09-26 09:53:46

标签: closures swift3

我正在尝试迁移第三方lib(通过Ramotion扩展集合)到swift 3。 我指出了一些瓶颈。

我有这个结构:

struct ConstraintInfo {
  var attribute: NSLayoutAttribute = .left
  var secondAttribute: NSLayoutAttribute = .notAnAttribute
  var constant: CGFloat = 0
  var identifier: String?
  var relation: NSLayoutRelation = .equal
}

此运算符有一些重载:

precedencegroup ComparisonPrecedence {     结社性:左     higherThan:LogicalConjunctionPrecedence }

infix operator >>>- : ComparisonPrecedence

func >>>- <T: UIView> (left: (T, T), block: (_: inout ConstraintInfo) -> ()) -> NSLayoutConstraint {
  var info = ConstraintInfo()
  block(&info)
  info.secondAttribute = info.secondAttribute == .notAnAttribute ? info.attribute : info.secondAttribute

  let constraint = NSLayoutConstraint(item: left.1,
                                  attribute: info.attribute,
                                  relatedBy: info.relation,
                                  toItem: left.0,
                                  attribute: info.secondAttribute,
                                  multiplier: 1,
                                  constant: info.constant)
  constraint.identifier = info.identifier
  left.0.addConstraint(constraint)
  return constraint
}

这个方法在UIView扩展中:

func addScaleToFillConstratinsOnView(_ view: UIView) {
    [NSLayoutAttribute.left, .right, .top, .bottom].forEach { attribute in
        (self, view) >>>- { $0.attribute = attribute } // this line is erroring
    }
  }

错误说:

  

“'&gt;&gt;&gt; - '生成'NSLayoutConstraint',而不是预期的上下文结果类型'Void'(又名'()')”

我将错误行更改为

var _: NSLayoutConstraint = (self, view) >>>- { $0.attribute = attribute }

现在我得到了:

  

表达式类型'()'不含更多上下文

是不明确的

另外,如果我写:

$0.attribute as! NSLayoutAttribute = attribute as! NSLayoutAttribute

我遇到了不变性错误。

我错过了什么?

1 个答案:

答案 0 :(得分:0)

在我的情况下,我这样解决了:

[NSLayoutAttribute.left, .right, .centerY].forEach { attribute in
      _ = (view, collectionView) >>>- {
        var _: ConstraintInfo = $0
        $0.attribute = attribute
        }
}