2017-09-15 72 views
0

我有一個奇怪的問題,無法在相對較大的混合ObjC/Swift項目中實現一個Swift協議的項目。XCode/Cocoapods爲什麼我不能從Pod實現Swift協議?

我們的工作項目是關於應用程序50K行代碼和約20個Cocoapods。該項目最初是一個ObjC項目,但現在約有60%的Swift3和40%的ObjC。

我工作了XCode 8.3.3,同時也看到了XCode 9-GM

中的CocoaPods問題是迅速和ObjC的混合。這一切工作正常,所以通常從Swift從ObjC或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 < - > Swift互操作性工作正常。這只是這一個。

我知道這應該工作。

我創建了一個新項目作爲一個例子來證明(對我自己)它應該確實可以正常工作。下面是我使用的步驟:

  • 創建開始作爲ObjC項目
  • 添加一個快捷文件來設置橋接報頭
  • 添加CountryPickerSwift cocoapod的項目。
  • 從工作項目批發中添加了PhoneCountryCodePickerViewController(即實施違規CountryPickerDelegate)。

該示例項目位於:https://github.com/SuperTango/CountryPickerExample並且正常工作。我檢查了CountryPickerExample-Swift.h文件,並且就CountryPicker代碼而言,它與工作項目「-Swift.h」文件完全相同。

我找不出爲什麼工作項目失敗,但示例項目成功。 GAH!

任何想法?

回答

0

謝謝你使用我的圖書館。 固定在pod版本1.4.5中。使用最新版本

+0

太好了。有什麼問題? – SuperDuperTango