Secara singkat, saat menggunakan Xcode 9 Beta, saya telah menjalankan peringatan berikut:
Penggunaan inferensi Swift 3 @objc dalam mode Swift 4 sudah usang. Harap alamat peringatan inferensi @objc yang sudah tidak berlaku, uji coba kode Anda dengan mengaktifkan "Pencatatan inferensi Swift 3 @objc yang sudah tidak berlaku" diaktifkan, dan nonaktifkan inferensi Swift 3 @objc. **
Setelah beberapa penelitian, saya masih tidak tahu bagaimana cara memperbaiki masalah ini. Saya akan sangat menghargai tips tentang cara memperbaiki masalah ini serta penjelasan tentang apa yang sedang terjadi.
Tujuan saya adalah untuk memahami dengan lebih baik apa yang terjadi dengan kode saya.
swift
swift4
xcode9-beta
DaleK
sumber
sumber
Jawaban:
Saya menyingkirkan peringatan ini dengan mengubah pengaturan build "Swift 3 @objc Inference" dari target saya menjadi "Default".
Dari artikel ini :
Lihat juga proposal Swift ini untuk informasi lebih lanjut.
sumber
@objc
inferensi Swift 3 dalam mode Swift 4 sudah usang. Harap alamat@objc
peringatan inferensi yang tidak digunakan lagi , uji kode Anda dengan@objc
mengaktifkan" inferensi Swift 3 usang "yang diaktifkan , dan nonaktifkan@objc
inferensi Swift 3. " Adakah yang tahu di mana harus mengaktifkan@objc
logging inferensi Swift 3 ?- Apa itu
@objc
kesimpulan? Apa yang sedang terjadi?Di
Swift 3
, kompiler menyimpulkan@objc
di sejumlah tempat sehingga Anda tidak perlu melakukannya. Dengan kata lain, itu memastikan untuk menambahkan@objc
untuk Anda!Di
Swift 4
, kompiler tidak lagi melakukan ini (sebanyak). Anda sekarang harus menambahkan@objc
secara eksplisit.Secara default, jika Anda memiliki proyek pra-Swift 4, Anda akan mendapatkan peringatan tentang ini. Dalam proyek Swift 4, Anda akan mendapatkan galat build. Ini dikontrol melalui
SWIFT_SWIFT3_OBJC_INFERENCE
pengaturan build. Dalam proyek pra-Swift 4 ini diatur keOn
. Saya akan merekomendasikan untuk mengatur ini keDefault
(atauOff
), yang sekarang merupakan opsi default pada proyek baru.Diperlukan waktu untuk mengonversi semuanya, tetapi karena ini adalah default untuk Swift 4, perlu dilakukan.
- Bagaimana saya menghentikan peringatan / kesalahan kompiler?
Ada dua cara untuk mengubah kode Anda sehingga kompiler tidak mengeluh.
Pertama adalah menggunakan
@objc
setiap fungsi atau variabel yang perlu diekspos ke runtime Objective-C:Yang lain adalah dengan menggunakan
@objcMembers
olehClass
deklarasi. Hal ini akan memastikan untuk secara otomatis menambahkan@objc
ke semua fungsi dan variabel di kelas. Ini adalah cara yang mudah, tetapi memiliki biaya, misalnya, dapat meningkatkan ukuran aplikasi Anda dengan mengekspos fungsi yang tidak perlu diekspos.- Apa itu
@objc
dan mengapa itu perlu?Jika Anda memperkenalkan metode atau variabel baru ke kelas Swift, menandai mereka sebagai
@objc
mengekspos mereka ke runtime Objective-C. Ini diperlukan ketika Anda memiliki kode Objective-C yang menggunakan kelas Swift Anda, atau, jika Anda menggunakan fitur tipe Objective-C sepertiSelectors
. Misalnya, pola aksi target:button.addTarget(self, action:#selector(didPressButton), for:.touchUpInside)
- Mengapa saya tidak menandai semuanya
@objc
?Ada negatif yang muncul dengan menandai sesuatu sebagai
@objc
:Harap diingat bahwa ini adalah ringkasan yang sangat tinggi dan lebih rumit daripada yang saya tulis. Saya akan merekomendasikan membaca proposal yang sebenarnya untuk informasi lebih lanjut.
Sumber:
sumber
@objc
tidak menyiratkan pengiriman dinamis, Swift bebas menggunakan pengiriman statis atau virtual (dan mungkin mengeksekusi kode yang berbeda sebagai hasilnya). Katadynamic
kunci diperlukan untuk memaksa Swift menggunakan pengiriman dinamis.@objc
kehilangan apa yang harus kita gunakan?SWIFT_SWIFT3_OBJC_INFERENCE
diOn
. Konversikan ke Swift 4. Lalu tangani@objc
barang - barang itu. Untuk membuatnya sederhana, ikuti aturan dasar: JIKA kelas Swift digunakan dalam kode Objc-C (via bridging header), gunakan@objcMembers
, jika tidak, tambahkan satu-per-satu@objc
. Cukup gunakan pencarian Xcode untuk mengetahui apakah kelas Swift dipanggil dari.m
file apa pun . Ini seharusnya membuat konversi relatif tidak menyakitkan.@objc
perubahan di Swift 4 dan kemudian membuat keputusan untuk memperbaiki proyek dan tetap sama.Migrator tidak dapat mengidentifikasi semua fungsi yang membutuhkan @objc Inferred Objective-C thunks yang ditandai sebagai usang untuk membantu Anda menemukannya
• Membuat peringatan tentang metode yang sudah usang
• Pesan konsol saat menjalankan thunks yang sudah usang
sumber
Saya mendapat peringatan ini dengan "Swift 3 @objc Inference" = "Pengaturan default". Kemudian saya menyadari bahwa itu ditetapkan untuk Proyek - bukan untuk target. Jadi, pastikan Anda memiliki pengaturan "Default" di target Anda untuk menghilangkan peringatan.
sumber
Anda cukup beralih ke "default" alih-alih "ON". Tampak lebih patuh pada logika Apple.
(tetapi semua komentar lain tentang penggunaan
@obj
tetap valid.)sumber
Memang, Anda akan menyingkirkan peringatan itu dengan menonaktifkan Swift 3 @objc Inference. Namun, masalah halus mungkin muncul. Misalnya, KVO akan berhenti bekerja. Kode ini berfungsi dengan baik di bawah Swift 3:
Setelah bermigrasi ke Swift 4, dan menetapkan "Swift 3 @objc Inference" ke default, fitur tertentu dari proyek saya berhenti berfungsi . Butuh beberapa debug dan riset untuk menemukan solusi untuk ini. Menurut pengetahuan terbaik saya, berikut adalah pilihannya:
Mengaktifkan kembali inferensi @objc memberi Anda peringatan, tetapi ini solusi tercepat. Perhatikan bahwa ini hanya tersedia untuk proyek yang dimigrasikan dari versi Swift sebelumnya. Dua opsi lainnya lebih membosankan dan memerlukan beberapa penggalian kode dan pengujian ekstensif.
Lihat juga https://github.com/apple/swift-evolution/blob/master/proposals/0160-objc-inference.md
sumber
Saya sesekali iOS dev (segera menjadi lebih), tetapi saya masih tidak dapat menemukan pengaturan seperti yang dipandu oleh jawaban lain (karena saya tidak memiliki item Keychain yang jawabannya tampilkan), jadi sekarang saya menemukannya, saya pikir Saya mungkin menambahkan snapshot ini dengan lokasi yang disorot yang perlu Anda klik dan temukan.
sumber
Anda dapat mencoba "Pembaruan pod" dan / atau "flutter clean"
Saya juga mengatur pengaturan ini dalam xcode.
Pengaturan antarmuka Objective-C adalah sebagai berikut:
sumber
Swift 3 @objc Inference Penggunaan inferensi Swift 3 @objc dalam mode Swift 4 sudah usang. Harap alamat peringatan inferensi @objc yang sudah tidak berlaku, uji kode Anda dengan pencatatan "Penggunaan inferensi Swift 3 @objc yang sudah usang" diaktifkan, lalu nonaktifkan inferensi dengan mengubah pengaturan build "Swift 3 @objc Inference" ke "Default" untuk "XMLParsingURL" target.
sampai ke
Langkah pertama adalah Build Setting
Cari di untuk Membangun Inferensi Pengaturan
ubah Swift 3 @objc Inference Default
masukkan deskripsi gambar di sini
sumber
Yang Anda butuhkan hanya menjalankan tes tunggu sampai selesai, setelah itu pergi ke Build Setting, Cari in untuk Build Setting Inference, ubah Swift 3 @objc Inference ke (Default). itu semua yang saya lakukan dan bekerja dengan sempurna.
sumber
gunakan func call @objc
sumber
Di atas apa yang dikatakan @wisekiddo, Anda juga dapat memodifikasi pengaturan build Anda di
project.pbxproj
file dengan mengatur Swift 3 @obj Inference ke default sepertiSWIFT_SWIFT3_OBJC_INFERENCE = Default;
untuk rasa build Anda (yaitu debug dan lepaskan), terutama jika Anda berasal dari lingkungan lain selain Xcodesumber