【发布时间】:2016-09-26 09:53:46
【问题描述】:
我正在尝试将 3rd 方库(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 比较Precedence { 关联性:左 高于: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
}
}
错误提示:
"'>>>-' 产生 'NSLayoutConstraint',而不是预期的上下文结果类型 'Void' (aka '()')"
我将错误行改为
var _: NSLayoutConstraint = (self, view) >>>- { $0.attribute = attribute }
现在我得到了:
表达式类型 '()' 在没有更多上下文的情况下是模棱两可的
另外,如果我写:
$0.attribute as! NSLayoutAttribute = attribute as! NSLayoutAttribute
我遇到了不可变性错误。
我错过了什么?
【问题讨论】: