我有一個奇怪的問題,無法在相對較大的混合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 CountryPickerSwift
(https://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!
任何想法?
太好了。有什麼問題? – SuperDuperTango