私は、比較的大きな混合ObjC/Swiftプロジェクトで迅速なプロトコルを実装できないプロジェクトに奇妙な問題があります。Xcode/CocoapodsなぜPodからSwiftプロトコルを実装できないのですか?
私たちの仕事のプロジェクトは、約50K行のコードと約20個のココアポードです。このプロジェクトはもともとObjCプロジェクトでしたが、現在はSwift3の約60%、ObjCの約40%です。
私は、迅速かつにObjCのミックスがされているXCodeの8.3.3に取り組んでなく、XCodeの9-GM
cocoapodsは、問題を見ています。これはすべて正常に動作するので、通常はSwiftのSwiftをSwiftのObjCやObjCから呼び出しても問題ありません。
ただし、UIViewControllerでSwiftプロトコル(@objc
フラグが設定されています)を実装しようとするのは初めてです。
私は最近ココアポッドCountryPickerSwift
(https://cocoapods.org/pods/CountryPickerSwift)を追加しました。 CountryPickerDelegate
:
@objc public protocol CountryPickerDelegate {
func countryPhoneCodePicker(_ picker: CountryPicker, didSelectCountryWithName name: String, countryCode: String, phoneCode: String, flag: UIImage)
}
これは超簡単で、動作するはずです:CountryPicker
コードベースインサイド
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)")
}
}
、CountryPickerDelegate
は次のように定義された私のViewControllersの一つで、CountryPickerからプロトコルを実装する拡張機能を追加しました良い。私が実行しようとすると、
はしかし、私は次のエラーを取得する:
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プロトコルの名前を変更しようとしましたが、それは助けになりません。
また、他のすべてのObjC < - >迅速な相互運用性は問題ありません。それはちょうどこれです。
これはうまくいくはずです。
私は実際にうまくいくはずであることを証明するための例として、新しいプロジェクトを作成しました。ここで私が使用する手順は、次のとおりです。
- が
- は、ブリッジングヘッダー
- が
CountryPickerSwift
cocoapodを追加セットアップに迅速ファイルを追加にObjCプロジェクトとして開始されたプロジェクトを作成しました。 CountryPickerDelegate
を実装しているPhoneCountryCodePickerViewController
を作業プロジェクトの卸売りから追加しました。
サンプルプロジェクトはhttps://github.com/SuperTango/CountryPickerExampleで、正常に動作します。私はCountryPickerExample-Swift.hファイルを検査し、CountryPickerコードがある限り、それは仕事プロジェクト "-Swift.h"ファイルとまったく同じです。
私は仕事のプロジェクトが失敗したが、そのプロジェクトの例が成功する理由を理解できません。 GAH!
アイデア?
素晴らしいです。なにが問題だったの? – SuperDuperTango