XCode / Cocoapods为什么我不能从Pod实现Swift协议?

时间:2017-09-15 23:06:54

标签: objective-c swift xcode

我遇到一个奇怪的问题,项目无法在相对较大的混合ObjC / Swift项目中实现swift协议。

我们的工作项目是关于app 50K代码行,以及大约20个Cocoapods。该项目最初是一个ObjC项目,但现在它大约有60%的Swift3和40%的ObjC。

我正在使用XCode 8.3.3,但也看到了XCode 9-GM中的问题

cocoapods是swift和ObjC的混合体。这一切都很好,所以通常从ObjC调用swift或从Swift调用ObjC工作正常。

然而,这可能是我第一次尝试在UIViewController中实现一个Swift协议(标有@objc标志)。

我最近添加了cocoapod CountryPickerSwifthttps://cocoapods.org/pods/CountryPickerSwift)。在我的一个ViewControllers中,添加了一个扩展来实现CountryPicker中的协议:CountryPickerDelegate

import CountryPicker

class PhoneCountryCodePickerViewController: UIViewController {

    // ...

    override func viewDidLoad() {
        super.viewDidLoad()
        self.countryPicker.countryPickerDelegate = self
    }

    // ...

}

extension PhoneCountryCodePickerViewController: CountryPickerDelegate {
    func countryPhoneCodePicker(_ picker: CountryPicker, didSelectCountryWithName name: String, countryCode: String, phoneCode: String, flag: UIImage) {
        NSLog ("country: \(name), countryCode: \(countryCode), phoneCode: \(phoneCode)")
    }
}

CountryPicker代码库中,CountryPickerDelegate定义为:

@objc public protocol CountryPickerDelegate {
   func countryPhoneCodePicker(_ picker: CountryPicker, didSelectCountryWithName name: String, countryCode: String, phoneCode: String, flag: UIImage)
}

这非常简单,应该可以正常工作。

但是,当我尝试运行时,出现以下错误:

Cannot find protocol declaration for 'CountryPickerDelegate'
MyWorkProject-Swift.h

(显然我的工作项目不是MyWorkProject,但无论如何)。

MyWorkProject-Swift.h文件中,我看到了:

@import CountryPicker;

// ...

@class CountryPicker;

// ...

@interface PhoneCountryCodePickerViewController (SWIFT_EXTENSION(Playlist)) <CountryPickerDelegate>
- (void)countryPhoneCodePicker:(CountryPicker * _Nonnull)picker didSelectCountry:(Country * _Nonnull)country;
@end

对于我的生活,我无法弄清楚为什么我会收到此错误。我已经尝试重命名代表协议,以防有一些奇怪的碰撞,但这并没有帮助。

同样,所有其他ObjC&lt; - &gt; Swift互操作性工作正常。它就是这个。

我知道这应该可行。

我创建了一个新项目作为一个例子来证明(对我自己)它确实应该正常工作。以下是我使用的步骤:

  • 创建了一个以ObjC项目启动的项目
  • 添加了一个swift文件来设置Bridging Header
  • 添加了CountryPickerSwift cocoapod。
  • 从工作项目批发中添加了PhoneCountryCodePickerViewController(实施违规CountryPickerDelegate)。

示例项目在这里:https://github.com/SuperTango/CountryPickerExample并且工作正常。我已经检查了CountryPickerExample-Swift.h文件,就CountryPicker代码而言,它与Work Project&#34; -Swift.h&#34;完全相同。文件。

我无法弄清楚工作项目失败的原因,但示例项目成功了。 GAH!

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

感谢您使用我的图书馆。 已修复pod版本1.4.5。使用最新版本