【问题标题】:Swift CocoaPod Library in Objective-C Project Migration from Swift 3 to 4/5Objective-C 项目中的 Swift CocoaPod 库从 Swift 3 迁移到 4/5
【发布时间】:2020-04-06 10:30:11
【问题描述】:

我在我的 Objective-C 项目中使用 Swift CocoaPod。最初它是一个 Swift 3 项目,我只需将 #import "<Project Name>-Swift.h" 添加到我的 .m 或 .h 文件中。我已经更新到最新版本的 CocoaPod,我相信它现在是 Swift 5。因此这不再有效,因为找不到任何属性。

我查看了许多不同的在线资源,包括 Apple 的文档,但这里的程序不清楚该怎么做。看来我必须进入并编辑.swift 文件并在我希望访问的每个属性或方法前面添加@objc?这似乎与 CocoaPods 的意图背道而驰,因为下次我更新所有更改时都会被吹走。

我尝试查看生成的标题,但是当我突出显示 #import "<Project Name>-Swift.h" 行时,我只是被带到了 NSObject 声明。显然,这只是我猜测的构建时间项目。

根据 Apple 文档 (https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/importing_swift_into_objective-c),Swift 声明必须标有 public 或 open 修饰符,当我检查 swift 文件时,我发现它们确实如此。

我使用的吊舱是 HGCircularSlider。我尝试访问的示例在 RangeCircularSlider 类中:

    open var startPointValue: CGFloat = 0.0 {
        didSet {
            guard oldValue != startPointValue else { return }

            if startPointValue < minimumValue {
                startPointValue = minimumValue
            }

            if distance > 0 {
                endPointValue = startPointValue + distance
            }

            setNeedsDisplay()
        }
    }

正如我们在这里看到的,声明是公开的。我假设我需要设置某种构建设置?

此外,我在我的 Podfile 中设置了 use_frameworks!。我还检查了 pod 项目中的构建目标和 Objective-C 生成的接口标题名称是 HGCircularSlider-Swift.h。这正是我在 Objc .m 文件中使用的内容。

欢迎任何想法或建议我应该去哪里看?

更新 1

还有一点值得注意。在我的 .h 和 .m 中,我有一个 RangeCircularSlider 类型的 @property,它可以很好地看到。那里没有错误。它正在访问导致错误的对象中的属性和方法。

在“RangeCircularSlider *”类型的对象上找不到属性“startPointValue”

所以它看到了 swift 文件,但正如最初所说,找不到任何属性。

更新 2

所以我发现,如果我将 @objc 添加到我试图在 Swift 文件中访问生成的头文件的各个属性的前面,然后查看它们,因此我可以访问它们。因此,对于上面的示例函数,它将是

@objc open var startPointValue: CGFloat = 0.0 {

但是,当我想安装此 CocoaPod 的更新版本时,这些似乎有点小题大做,那么我对 pod 文件所做的那些更改就会被吹走。

有什么建议可以在无需编辑 CocoaPod 中的 swift 文件的情况下执行此操作吗?

【问题讨论】:

    标签: objective-c swift cocoapods


    【解决方案1】:

    对于遇到此问题的其他任何人。我发现的在线资源很有帮助,但没有详细说明这个具体案例。

    1. 首先。保持 CocoaPod 代码不变。这将允许您更新它,而不必担心每次都对其进行修改。

    2. 接下来在您的 Objective C 项目中创建一个 Swift 文件。 xCode 会询问您是否要为其生成标头,说是。该文件将被称为 -Swift.h。

    3. 在这个 Swift 文件子类中,您有兴趣访问 CocoaPod 中的 Swift 文件。

    例如:

    import Foundation
    import HGCircularSlider
    
    class CircularSliderObjc: RangeCircularSlider {
    }
    
    1. 接下来添加您希望使用 getter 和 setter 访问的属性。
        @objc override open var startPointValue: CGFloat {
    
            get {
                return super.startPointValue;
            }
    
            set {
                super.startPointValue = newValue;
            }
        }
    
    1. 然后最后将 Objective-C 文件中的导入更改为我上面提到的项目生成的头文件 (#import "-Swift.h" )。如果您有一个指向 CocoaPod 中的类的属性,请将其更改为您的新 Swift 类。例如:
    @property (weak, nonatomic) IBOutlet CircularSliderObjc *rangeSlider;
    

    在此示例中,我将其设置为 InterfaceBuilder 的 Outlet。

    之后,您就完成了。这似乎是很多工作,但它非常容易和简单。不如导入标头那么快,但从 Swift 4 和 5 开始,您不能再将 Swift 中的开放变量作为 objc 中的属性访问。他们需要 @objc 声明来完成这项工作。为我猜测的语言增加了安全性。

    希望这对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多