【发布时间】:2016-08-29 10:44:17
【问题描述】:
在将项目从 Xcode 7 更新到 8 的过程中,我遇到了一个问题。
有一个通用的infix 操作符处理UIViews 上的约束。
这里是操作符的定义:
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
}
}
我也用非泛型函数测试过,它仍然会抱怨块的类型。
有什么想法吗?
P.S.:我不是代码的原作者,我正在尝试为 PR 更新代码,更改语法会影响太多代码。
【问题讨论】:
-
代码不多,你可以在任何地方轻松验证。我以为我已经提供了足够的证据。你还需要什么?
-
是的,没错。我已经清理并删除了派生数据和所有内容。我已经测试了你的要点,它按预期工作,但在主项目中。我猜是设置搞砸了。我现在必须调查项目的构建设置。感谢您的帮助。
标签: ios generics operator-overloading swift3