swift - 扩展 NSLayoutAnchor 编译错误

标签 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 */ 并说:“Expected a type”。嗯,这是有道理的,因为 /* AnchorType */ 不是类型而是注释。但是,我在方法签名中使用了 AnchorType 类型参数。

扩展源码如下:

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

最佳答案

注意:自 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
}

关于swift - 扩展 NSLayoutAnchor 编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42444110/

相关文章:

ios - 如何在swift中更新 anchor 约束

ios - 使用 NSLayoutAnchor 在两个标签之间创建约束?

swift - 尝试从基类 : cannot override stored property 继承时出错

swift - 如何获取当前位置的带有浅蓝色字段的 iPhone map 应用程序蓝点?

ios - UIImageView 数组不显示内容?

ios - 在隐藏的导航栏上具有不同行为的 ViewController

ios - 另一个 UINavigationController 内的 UITabBarController 内的 UINavigationController 的问题

ios - UIScrollView 单元格内的 UICollectionView 消失

iphone - 如何在 iPhone 模拟器中重置 NSUserDefaults 数据?

swift - NSLayoutConstraint:在 View 之间添加线