从Swift 3迁移到4/5的Objective-C项目中的Swift CocoaPod库

埃特普

我在Objective-C项目中使用的是Swift CocoaPod。最初,这是一个Swift 3项目,我只需要将#import "<Project Name>-Swift.h".m或.h文件添加到其中。从那以后,我已经更新到了CocoaPod的最新版本,我相信它现在是Swift5。因此,由于找不到任何属性,它不再起作用。

我在网上查看了许多不同的资源,包括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()
        }
    }

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

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

欢迎任何其他想法或意见,我还有什么地方可以看?

更新1

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

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

因此它看到的是swift文件,但如最初所述,找不到任何属性。

更新2

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

@objc open var startPointValue: CGFloat = 0.0 {

但是,当我要安装此CocoaPod的更新版本时,这些似乎有点hack,然后我对pod的文件所做的更改将被删除。

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

埃特普

对于遇到此问题的其他任何人。我发现的在线资源很有帮助,但没有详细介绍此特定案例。

  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的插座。

之后,您就完成了。似乎需要做很多工作,但是非常简单。不像导入标头那样快,但是由于Swift 4和5,您不能再将Swift中的开放变量作为objc中的属性来访问。他们需要@objc声明才能使该工作。为我猜测的语言增加了安全性。

希望这对某人有帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Objective C 项目中 ScrollableGraphicView Swift 库的问题

Swift项目无法识别CocoaPod库

尝试在带有桥接头的Swift项目中尝试使用Objective-C库

在Swift项目中添加Objective-C库会增加应用程序的大小吗?

如何在 Objective-C 项目中符合在 Swift 库中制定的协议

使GoogleAnalytics CocoaPod可以在Swift项目中工作

无法将Cocoapod主存储库Pod安装到Swift项目中

将iOS Cocoa静态库项目中的Objective-C代码与iOS应用程序项目中的Swift代码一起使用

如何在C ++项目中使用Swift静态库(.a)?

在Swift项目中正确使用Obj-C库

Swift项目中的Objective-C的条件编译

在Xcode Swift项目中使用Objective C框架

在Objective-c项目中编码Swift对象

在Swift项目中使用Objective-C代码,该项目同时使用Swift代码

Swift项目中的链接框架和库

创建CocoaPod时,“静态库不支持Swift”

使Swift CocoaPod库可用于macOS和iOS

如何在我的Swift项目中使用Objective-C项目

如何通过迦太基在Obj-C项目中使用Swift库

Travic未能建立Objective-C Cocoapod库

当前在混合 Objective-C/Swift 项目中的导入方式

Objective-C项目中的Swift类(编译器错误)

如何在Objective-C项目中导入和使用Swift Pod框架

如何在Xcode项目中将Font Awesome与Objective-C或Swift集成并使用?

在Xamarin iOS项目中使用Swift框架内的Objective C框架

如何在Swift项目中使用Objective-C CocoaPods

将Swift集成到导出的Unity项目中,而不是使用Objective C?

为什么在Swift项目中需要Objective-C桥接头?

如何使 Swift 包在 Objective-C 项目中可导入/可用?