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

从Swift 3迁移到4/5的Objective-C项目中的Swift CoCoCoaPod库,objective-c,swift,cocoapods,Objective C,Swift,Cocoapods,我在我的Objective-C项目中使用了一个Swift CocoaPod。最初它是一个Swift 3项目,我只需将#import“-Swift.h”添加到我的.m或.h文件中。我已经更新到最新版本的CocoaPod,我相信现在是Swift 5。因此,这不再有效,因为找不到任何属性 我在网上查阅了许多不同的资源,包括苹果的文档,但程序不清楚该怎么做。似乎我必须进入并编辑.swift文件,并在我希望访问的每个属性或方法前面添加@objc?这似乎违背了CocoaPods的初衷,因为下一次我更新时,所

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

我在网上查阅了许多不同的资源,包括苹果的文档,但程序不清楚该怎么做。似乎我必须进入并编辑
.swift
文件,并在我希望访问的每个属性或方法前面添加
@objc
?这似乎违背了CocoaPods的初衷,因为下一次我更新时,所有的更改都会被吹走

我试图查看生成的标题,但当我突出显示
#import“-Swift.h”
行时,我只看到了NSObject声明。显然,我猜这只是一个构建时项目

根据Apple文档()的规定,Swift声明必须用public或open修饰符标记,当我检查Swift文件时,我发现它们确实是

我用的吊舱是HGCircularSlider。我尝试访问的Range CircularSlider类中的一个示例如下:

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

            if startPointValue < minimumValue {
                startPointValue = minimumValue
            }

            if distance > 0 {
                endPointValue = startPointValue + distance
            }

            setNeedsDisplay()
        }
    }
但这些似乎有点像黑客,因为当我想安装这个CocoaPod的更新版本时,我对pod文件所做的更改就会被吹走


有没有建议如何在不必编辑CocoaPod中的swift文件的情况下执行此操作?

,供其他人参考。我找到的在线资源很有用,但没有详细说明这个具体案例

  • 首先。让CocoaPod代码保持原样。这将允许您更新它,而不必担心每次都要修改它

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

  • 在此Swift文件中,将您感兴趣访问的CocoaPod中的Swift文件子类化

  • 例如:

    import Foundation
    import HGCircularSlider
    
    class CircularSliderObjc: RangeCircularSlider {
    }
    
  • 下一步添加希望使用getter和setter访问的属性
  • 最后,将Objective-C文件中的导入更改为我前面提到的项目生成的头文件(#import“-Swift.h” )。如果您有指向CocoaPod中的类的属性,请将其更改为新的Swift类。例如:
  • 在本例中,我将其设置为InterfaceBuilder的出口

    在那之后,你就完了。这似乎是一个很大的工作,但它是相当容易和简单的。没有导入标题那么快,但是由于Swift 4和5,您不能再只访问Swift中的开放变量作为objc中的属性。他们需要@objc声明来实现这一点。增加了我猜的语言的安全性

    希望这对别人有帮助

    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;