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

标签 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' 处有错误,出于某种原因奇怪地封装在/* */中:

@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/

相关文章:

ios - Swift - 将目标添加到 subview 内的 UIButton

swift - queryOrdered 并不总是以正确的顺序返回 tableViewCell 上的数据

php - 如何在codeigniter中使用事件类制作if else菜单

php - 什么是帮助类和脚本?

scala - 有哪些 Scala Web 框架可用?

ios - 在 iPad Form Sheet 上响应时间非常慢

ios - 命令 PhaseScriptExecution 失败,退出代码非零 - errSecInternalComponent

ios - 如何将 NSDictionary 解析为 NSUserDefaults IOS7

ios - 在 App Delegate 之外的 ViewController 中注册解析远程通知

swift - 这段代码中的 while 循环是如何工作的?