我在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中,我有一个@property
RangeCircularSlider类型,可以很好地看到它。那里没有错误。它正在访问导致错误的对象内的属性和方法。
在“ RangeCircularSlider *”类型的对象上找不到属性“ startPointValue”
因此它看到的是swift文件,但如最初所述,找不到任何属性。
更新2
因此,我发现,如果我在各个属性的前面添加@objc,则尝试在Swift文件中访问生成的头文件,然后查看它们,因此可以访问它们。因此,对于上面的示例函数,它将是
@objc open var startPointValue: CGFloat = 0.0 {
但是,当我要安装此CocoaPod的更新版本时,这些似乎有点hack,然后我对pod的文件所做的更改将被删除。
有什么建议如何在无需编辑CocoaPod中的swift文件的情况下执行此操作?
对于遇到此问题的其他任何人。我发现的在线资源很有帮助,但没有详细介绍此特定案例。
首先。保持CocoaPod代码不变。这样您就可以更新它,而不必担心每次都对其进行修改。
接下来,在您的Objective C项目中创建一个Swift文件。xCode会询问您是否要为其生成标题,请说是。该文件将称为-Swift.h。
在这个Swift文件子类中,您有兴趣访问来自CocoaPod的Swift文件。
例如 :
import Foundation
import HGCircularSlider
class CircularSliderObjc: RangeCircularSlider {
}
@objc override open var startPointValue: CGFloat {
get {
return super.startPointValue;
}
set {
super.startPointValue = newValue;
}
}
@property (weak, nonatomic) IBOutlet CircularSliderObjc *rangeSlider;
在此示例中,我将其设置为InterfaceBuilder的插座。
之后,您就完成了。似乎需要做很多工作,但是非常简单。不像导入标头那样快,但是由于Swift 4和5,您不能再将Swift中的开放变量作为objc中的属性来访问。他们需要@objc声明才能使该工作。为我猜测的语言增加了安全性。
希望这对某人有帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句