在扩展NSLayoutAnchor中编译错误

时间:2017-02-24 16:51:56

标签: swift uikit 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

错误指向/* AnchorType */并说:&#34;预期类型&#34;。嗯,这是有道理的,因为/* AnchorType */不是类型而是注释。但是,我在方法签名中使用AnchorType类型参数。

扩展源代码如下:

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

2 个答案:

答案 0 :(得分:6)

注意:自Swift 4起修复,请参阅下面的benrudhart的回答。

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

可能的解决方法是对NSLayoutAnchor的每种具体类型进行扩展。具体类型为NSLayoutXAxisAnchorNSLayoutYAxisAnchorNSLayoutDimension

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
}

答案 1 :(得分:3)

从Swift 4开始,现在可以通过使用@objc注释扩展名来实现。以下代码将编译:

@objc extension NSLayoutAnchor {
    func constraint(to anchor: NSLayoutAnchor<AnchorType>, multiplier: CGFloat) -> NSLayoutConstraint {
        // ...
    }
}