我有一个框架目标设置为在 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' 处有错误,出于某种原因奇怪地封装在/* */中:
@interface NSLayoutAnchor (SWIFT_EXTENSION(<module name>))
- (void)constrainEqual:(NSLayoutAnchor</* AnchorType */> * _Nonnull)anchor constant:(CGFloat)constant;
@end
这似乎是 swift 中的一个错误,其中自动生成的 objective-c 头文件(用于 swift 框架)对于这种特定类型是错误的。如果我删除扩展程序,问题就解决了。
我是不是包装错了?
最佳答案
目前这是 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)
}
关于ios - 导入具有一些 iOS 9+ 兼容逻辑的 iOS 8 框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41297516/