导入具有一些iOS 9+兼容逻辑的iOS 8框架

时间:2016-12-23 08:04:01

标签: ios swift frameworks

我有一个框架目标设置为在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中的一个错误。如果我删除扩展名,问题就解决了。

我的包装不正确吗?

1 个答案:

答案 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)
}