我有一个框架目标设置为在iOS 8上部署。所述框架中有一个扩展名,就像这样,包含在iOS 9检查中。
@available(iOS 9.0, *)
extension NSLayoutAnchor {
open func constrainEqual(_ anchor: NSLayoutAnchor, constant: CGFloat = 0) {
constraint(equalTo: anchor, constant: constant).isActive = true
}
}
当我将此框架导入仅具有Swift代码且设置为部署到iOS 8的App目标时,我从导入的swift框架objective-c头文件中收到以下错误。
:0:错误:无法构建Objective-C模块''期待一种类型。
swift框架的objective-c头文件在&AchorType' AchorType'在以下行中,由于某种原因奇怪地封装在/ * * /中:
@interface NSLayoutAnchor (SWIFT_EXTENSION(<module name>))
- (void)constrainEqual:(NSLayoutAnchor</* AnchorType */> * _Nonnull)anchor constant:(CGFloat)constant;
@end
对于这种特殊类型,自动生成的objective-c头文件(对于swift框架)错误,似乎是swift中的一个错误。如果我删除扩展名,问题就解决了。
我的包装不正确吗?
答案 0 :(得分:1)
目前这是swift和objc的一个问题。在swift中扩展objc泛型,然后不允许桥接到objc。即使添加@nonobjc也无法解决问题。请查看此处提交的错误:https://bugs.swift.org/browse/SR-2708了解更多信息。
一个潜在的解决方法是对每个具体类型的NSLayoutAnchor进行扩展。具体类型是NSLayoutXAxisAnchor,NSLayoutYAxisAnchor和NSLayoutDimension。
extension NSLayoutDimension {
open func constrainEqual(_ anchor: NSLayoutDimension, constant: CGFloat = 0)
}
extension NSLayoutXAxisAnchor {
open func constrainEqual(_ anchor: NSLayoutXAxisAnchor, constant: CGFloat = 0)
}
extension NSLayoutYAxisAnchor {
open func constrainEqual(_ anchor: NSLayoutYAxisAnchor, constant: CGFloat = 0)
}