繁体   English   中英

Swift 3通用中缀运算符错误

[英]Swift 3 Generic infix operator error

在将项目从Xcode 7更新到8的过程中,我遇到了一个问题。

有一个通用的infix运算符可处理UIView的约束。

这是运算符的定义:

precedencegroup constPrecedence {
  associativity: left
  higherThan: AssignmentPrecedence
}

infix operator >>>- : constPrecedence

@discardableResult
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
}

现在,在使用运算符时,出现了一个我不明白的错误:

   for attribute: NSLayoutAttribute in [.left, .right, .top, .bottom] {
      (view, self) >>>- {
        $0.attribute = attribute
      }
    }

中缀运算符错误

我也使用非泛型函数进行了测试,它仍然会抱怨该块的类型。

任何想法?

PS:我不是代码的原始作者,我正在尝试为PR更新代码,并且更改语法会影响太多代码。

通过在传递给操作员的代码块的末尾添加一个return调用,我能够解决此问题。 看来Swift 3.0编译器无法推断出代码块是没有return的闭包。 正如问题注释中提到的那样,原始运算符应该可以在新的Swift 3.0项目中正常工作,但是从较早的Swift版本转换项目似乎会以某种方式破坏运算符。

无论如何,这是现在运算符的正确用法,并且可以正常工作:

 for attribute: NSLayoutAttribute in [.left, .right, .top, .bottom] {
      (view, self) >>>- {
        $0.attribute = attribute
        return
      }
    }

PS:我之前一直在进行此修复,但是在修复了一些错误并且我不知道原因之后,我收到了奇怪的Segmentation Fault error 11 事实证明,Xcode无法处理某些闭包类型,并且发生了分段错误。 return叫添加到使用操作员的所有位置可以解决此问题。

我很乐意与任何感兴趣的开发人员讨论原因和更好的解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM