扩展 NSLayoutAnchor 编译错误
Compile error in extension 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
的每个具体类型进行扩展。具体类型为NSLayoutXAxisAnchor
、NSLayoutYAxisAnchor
和NSLayoutDimension
.
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 4 开始,现在可以通过使用 @objc
注释扩展来实现这一点。以下代码将编译:
@objc extension NSLayoutAnchor {
func constraint(to anchor: NSLayoutAnchor<AnchorType>, multiplier: CGFloat) -> NSLayoutConstraint {
// ...
}
}
我正在尝试在 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
的每个具体类型进行扩展。具体类型为NSLayoutXAxisAnchor
、NSLayoutYAxisAnchor
和NSLayoutDimension
.
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 4 开始,现在可以通过使用 @objc
注释扩展来实现这一点。以下代码将编译:
@objc extension NSLayoutAnchor {
func constraint(to anchor: NSLayoutAnchor<AnchorType>, multiplier: CGFloat) -> NSLayoutConstraint {
// ...
}
}