在扩展NSLayoutAnchor中编译错误

and*_*ewz 2 uikit swift nslayoutanchor

我试图在NSLayoutAnchor上创建一个扩展方法来接受一个乘数.我得到一个奇怪的Swift编译错误(Swift 3,XCode 8.2.1)不在扩展文件中,而是在相应的.h文件中(该文件由编译器自动生成)用于模块:

@interface NSLayoutAnchor (SWIFT_EXTENSION(MYMODULENAME))
- (NSLayoutConstraint * _Nonnull)constraintTo:(NSLayoutAnchor</* AnchorType */> * _Nonnull)anchor multiplier:(CGFloat)m;
@end
Run Code Online (Sandbox Code Playgroud)

错误指向/* AnchorType */并说:"预期类型".嗯,这是有道理的,因为/* AnchorType */它不是一种类型,而是一种评论.但是我AnchorType在方法签名中使用了type参数.

扩展源代码如下:

extension NSLayoutAnchor {
  open func constraint(to anchor: NSLayoutAnchor<AnchorType>, multiplier m: CGFloat) -> NSLayoutConstraint {
  // ...
  }
}
Run Code Online (Sandbox Code Playgroud)

Bra*_*loe 6

注意:从Swift 4开始修复,请参阅下面的benrudhart的回答.

目前这是swift和objc的一个问题.在swift中扩展objc泛型,然后不允许桥接到objc.即使添加一个@nonobjc也无法解决问题.请查看此处提交的错误:https://bugs.swift.org/browse/SR-2708了解更多信息.

一个潜在的解决方法是对每种具体类型进行扩展NSLayoutAnchor.具体类型是NSLayoutXAxisAnchor,NSLayoutYAxisAnchorNSLayoutDimension.

extension NSLayoutDimension {
    open func constraint(to anchor: NSLayoutDimension, 
             multiplier m: CGFloat) -> NSLayoutConstraint
}

extension NSLayoutXAxisAnchor {
    open func constraint(to anchor: NSLayoutXAxisAnchor, 
             multiplier m: CGFloat) -> NSLayoutConstraint
}

extension NSLayoutYAxisAnchor {
    open func constraint(to anchor: NSLayoutYAxisAnchor, 
             multiplier m: CGFloat) -> NSLayoutConstraint
}
Run Code Online (Sandbox Code Playgroud)