objective-c - Xcode/Cocoapods 为什么我不能从 Pod 实现 Swift 协议(protocol)?

标签 objective-c swift xcode

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

我们的工作项目涉及应用程序 5 万行代码和大约 20 个 Cocoapods。该项目原本是一个 ObjC 项目,但现在大约 60% Swift3 和 40% ObjC。

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

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

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

我最近添加了 cocoapod CountryPickerSwift ( https://cocoapods.org/pods/CountryPickerSwift )。在我的一个 ViewController 中,添加了一个扩展来实现 CountryPicker 的协议(protocol):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

对于我的一生,我无法弄清楚为什么会出现这个错误。我尝试重命名委托(delegate)协议(protocol),以防出现一些奇怪的冲突,但这没有帮助。

同样,所有其他 ObjC <-> Swift 互操作性都可以正常工作。就是这个。

我知道这应该可行。

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

  • 创建了一个作为 ObjC 项目启动的项目
  • 添加了一个 swift 文件来设置桥接头
  • 添加了 CountryPickerSwift cocoapod。
  • 从工作项目批量添加了 PhoneCountryCodePickerViewController(用于实现有问题的 CountryPickerDelegate)。

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

我不明白为什么工作项目失败但示例项目成功。

最佳答案

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

关于objective-c - Xcode/Cocoapods 为什么我不能从 Pod 实现 Swift 协议(protocol)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46248480/

相关文章:

iphone - UIScrollView scrollRectToVisible 没有做任何事情

objective-c - 新手对 NSMutable 数组的行为感到迷惑

objective-c - 检查应用程序范围内数据的变化

iphone - applicationWillEnterForeground 从未调用过

swift - 无法使用采样器显示纹理

swift :"Unrecognized selector sent to instance",Xcode 9.4.1

swift - NSPopUpButton 在 Swift Playground 中变灰

xcode - 在 React Native 应用程序中为 Fabric crashlytics 日志添加导入文件后,在 Xcode 中找不到 RCTLog.h 文件错误

ios - Container V 中的父 subview

iphone - arc 的核心图内存消耗问题