[英]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.