Saya mencoba mengimpor Protokol Swift bernama AnalyticProtocol
ke dalam kelas Objective-C bernama AnalyticFactory
.
protocol AnalyticProtocol
{
}
Saya memulai dari proyek Objective-C yang sudah ada (saya tidak membuat proyek Swift baru dengan xCode dan saya tidak menemukan cara mengkonfigurasi proyek Objective-C saya menjadi proyek Swift di xCode 6 ).
Di file Swift saya, saya menyertakan .h
file bernama MyProjectName-Swift.h
tetapi compiler mengembalikan saya kesalahan yang memberi tahu saya bahwa itu tidak ada . Jadi, saya membuat .h
file bernama MyProjectName-Swift.h
yang sebenarnya kosong (saya tidak tahu apa yang harus saya masukkan ke dalamnya).
Dalam dokumentasi Apple mereka mengatakan bahwa saya harus menyertakan .h
file saya yang diberi nama MyProjectName-Swift.h
di .m
file saya . Tapi saya perlu memasukkannya bukan ke .m
file saya, tetapi ke file saya .h
. Apakah ini bisa menjadi masalah?
Ketika saya mencoba untuk mengkompilasi, saya mendapat kesalahan ini :: 0: error: xxxAnalyticFactory.h: 39: tidak dapat menemukan deklarasi protokol untuk 'AnalyticProtocol'
Dan kode yang memberatkan:
@interface AnalyticFactory : NSObject
{
Class<AnalyticProtocol> _analyticProtocolClass; // The type of the analytic class currently used.
}
Saya rasa saya tidak mengerti dengan baik bagaimana saya bisa mengimpor protokol Swift ke dalam kelas Objective-C.
Apakah ada yang melihat kesalahan dalam apa yang saya lakukan?
sumber
Jawaban:
Anda perlu menambahkan
@objc
atribut ke protokol Swift Anda seperti ini:sumber
@interface
dalam.h
berkas. namun, Anda dapat menambahkan protokol ke privat@interface
dalam.m
file dan memperbaiki banyak hal (setidaknya kadang-kadang terjadi pada saya). Jadi di atas yang Anda@implementation
miliki@interface MyController() <AnalyticProtocol>
.Tidak mungkin mengimpor header Swift yang dibuat Xcode dalam file header objC.
Jadi, karena Anda ingin menggunakan kode Swift dalam file header objC, Anda perlu "meneruskan deklarasi" kelas dan protokol yang ingin Anda gunakan dalam file header objC, seperti ini:
Anda sekarang dapat menggunakan protokol dalam deklarasi kelas objC Anda:
Dalam file implementasi Anda (file objC .m), Anda dapat mengimpor file header Swift ("ProductModuleName-Swift.h") yang dihasilkan Xcode dan implementasi yang benar
AnalyticProtocol
sekarang akan diketahui oleh compiler.Ini juga dijelaskan di bagian "Menggunakan Swift dari Objective-C" di Apple Docs
Perhatikan bahwa XCode akan memberikan peringatan di file header objC ketika Anda menggunakan protokol yang dideklarasikan ke depan ("Tidak dapat menemukan definisi protokol untuk 'AnalyticProtocol'), tetapi ini dapat diabaikan - implementasi akan ditemukan pada waktu kompilasi.
sumber
No visible @interface for <ClassName> declares the selector <protocolMethodName>
Bagi siapa saja yang hanya perlu mengadopsi protokol - Anda dapat melakukannya dalam dua langkah, tanpa menimbulkan peringatan atau kesalahan:
Di
.swift
file Anda , tambahkan@objc
sebelum nama protokol:Di
.m
file Anda , impor header Swift yang dihasilkan dan adopsi protokol dalam kategori pribadi. (File header dinamai secara otomatis):Ini adalah pendekatan yang direkomendasikan Apple. Anda dapat mempelajari lebih lanjut tentang mencampur dan mencocokkan Objective-C dan Swift di sini: https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html
sumber
#import "AnalyticProtocol-Swift.h"
. Sepertinya AnyProtocol-Swift.h tidak dibuat secara otomatis seperti yang Anda katakan.Jika Anda membuat kerangka kerja, impor yang diperlukan
berubah menjadi:
Dalam hal ini Anda juga harus membuat protokol swift menjadi publik :
sumber
Kita dapat menggunakan protokol swift di Objective C dengan sedikit perubahan pada kode. Selain itu, dengan protokol yang dideklarasikan @objc memungkinkan Anda memiliki metode opsional dan wajib tanpa implementasi default. Itu datang dengan pro dan kontra.
Kami sebenarnya dapat menamai ulang nama protokol menjadi lebih deskriptif saat menggunakan di Objective C. Saya menggunakan "@objc (alias_name)".
Ini kodenya, Mari kita memiliki protokol cepat dengan atribut @objc dan nama alias untuk digunakan dalam kode ObjC.
Sekarang mari farword mendeklarasikan protokol kita dalam file .h
Sekarang Anda dapat mengikuti protokol ini dalam file .m dan menambahkan implementasi metode yang diperlukan.
sumber