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) >>>- {
[=12=].attribute = attribute
}
}
我也用非通用函数测试过,它仍然会抱怨块的类型。
有什么想法吗?
P.S.: 我不是代码的原作者,我正在尝试为 PR 更新代码,更改语法会影响太多代码。
我能够通过在传递给操作员的代码块末尾添加一个 return
调用来解决这个问题。似乎 Swift 3.0 编译器无法将代码块推断为没有 return
的闭包。正如问题评论中提到的,原始操作员应该可以在新的 Swift 3.0 项目中正常工作,但是从旧的 Swift 版本转换项目似乎以某种方式破坏了操作员。
任何方式这是运算符现在的正确用法并且工作正常:
for attribute: NSLayoutAttribute in [.left, .right, .top, .bottom] {
(view, self) >>>- {
[=10=].attribute = attribute
return
}
}
P.S.: 我之前一直在做这个修复,但是在修复了一些错误之后我得到了一个奇怪的 Segmentation Fault error 11
并且我不知道原因。事实证明,Xcode 无法处理某些闭包类型,并且发生了分段错误。将 return
调用添加到所有使用运算符的地方解决了问题。
我很乐意与任何感兴趣的开发人员讨论原因和更好的解决方案。
在将项目从 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) >>>- {
[=12=].attribute = attribute
}
}
我也用非通用函数测试过,它仍然会抱怨块的类型。
有什么想法吗?
P.S.: 我不是代码的原作者,我正在尝试为 PR 更新代码,更改语法会影响太多代码。
我能够通过在传递给操作员的代码块末尾添加一个 return
调用来解决这个问题。似乎 Swift 3.0 编译器无法将代码块推断为没有 return
的闭包。正如问题评论中提到的,原始操作员应该可以在新的 Swift 3.0 项目中正常工作,但是从旧的 Swift 版本转换项目似乎以某种方式破坏了操作员。
任何方式这是运算符现在的正确用法并且工作正常:
for attribute: NSLayoutAttribute in [.left, .right, .top, .bottom] {
(view, self) >>>- {
[=10=].attribute = attribute
return
}
}
P.S.: 我之前一直在做这个修复,但是在修复了一些错误之后我得到了一个奇怪的 Segmentation Fault error 11
并且我不知道原因。事实证明,Xcode 无法处理某些闭包类型,并且发生了分段错误。将 return
调用添加到所有使用运算符的地方解决了问题。
我很乐意与任何感兴趣的开发人员讨论原因和更好的解决方案。