Saya baru-baru ini bekerja untuk menambahkan Swift ke proyek yang ada, untuk mencobanya dengan cara dunia nyata.
Setelah menambahkan file sumber Swift ke proyek, saya tidak punya masalah tentang mendapatkan "Bridging Header", yaitu, Objective-C ke Swift.
Tetapi *-Swift.h
file header yang seharusnya mengekspos kelas Swift ditandai @objc
atau subclass dari kelas ObjC, tidak ditemukan dimanapun :-(
Saya tidak melihat instruksi khusus tentang bagaimana menyelesaikan penggunaan subclass baru saya, yang ditulis dalam Swift, dalam kode aplikasi utama saya (yang masih Objective-C).
Aplikasi yang saya pimpin pengembang memiliki basis kode yang cukup besar (70.000 baris), jadi mentransisikannya dalam sekali jalan adalah hal yang mustahil.
objective-c
xcode
swift
David Kristensen
sumber
sumber
Jawaban:
Sekarang berhasil.
Akhirnya berhasil. Terima kasih semuanya untuk bantuannya :-)
sumber
Build Settings
bawahPackaging
, sayaDefines Module
diatur keYes
dan saya membuatProduct Module Name
spasi tanpa. "* -Swift.h" tidak dihasilkan oleh XCode 6. ???Defines Module
menetapkanYes
untuk proyek dan target, dan yangProduct Module Name
ditentukan, tanpa spasi , tapi sepertinya saya tidak bisa mendapatkan file ini dihasilkan.Saya memiliki masalah yang sama dan menemukan bahwa Anda hanya dapat menambahkan
#import "ProductModuleName-Swift.h"
ke file obj-c .m, bukan file .h untuk header payung dapat ditemukan
sumber
Saya menemukan bahwa saya harus memperbaiki semua kesalahan build sebelum menghasilkan file.
Masalahnya bagi saya adalah bahwa itu masalah ayam / telur, karena saya tidak melihat kesalahan build sampai saya benar-benar berkomentar
#import
pernyataan://#import "ProductModuleName-Swift.h"
yang mengungkapkan banyak kesalahan lain dalam kode Swift saya.
Setelah saya memperbaiki kesalahan baru ini dan berhasil membangun sumber, saya membatalkan komentar
#import
dan bingo! Header dibuat dan mengimpor dengan benar :)sumber
Jika Anda seperti saya, Anda mungkin salah nama tajuknya. Setelah memukul kepala saya sebentar, saya mencari file di DerivedData dan cukup yakin ada di sana. Pada pengaturan saya (menggunakan folder data turunan standar, saya percaya):
Akan menemukannya. Jika tidak ada dalam folder yang cocok maka Xcode tidak menghasilkannya.
Saya menggunakan Xcode Versi 6.2 (6C86e)
sumber
-Swift.h
dan bukan nama file Swift saya yang sebenarnya. Terima kasih!Jika nama modul proyek Anda memiliki spasi di dalamnya, Anda harus mengganti spasi dengan garis bawah.
Misalnya, jika nama proyek Anda adalah "Proyek Saya", Anda akan menggunakan:
sumber
* Satu-satunya hal yang penting adalah: *
untuk menggunakan "Nama Modul Produk" yang ditentukan dalam target, diikuti oleh -Swift.h
Tidak masalah jika param "Tentukan Modul" diatur ke Ya atau Tidak atau jika Proyek "Nama Modul Produk" tidak disetel.
Pengingat: Kelas Swift harus berasal dari NSObject atau ditandai dengan atribut @objc agar dapat diekspos ke ObjectiveC / Foundation || Biji cokelat ...
sumber
Saya ingin menambahkan satu lagi alasan Anda mungkin menemukan masalah dengan ini - saya sedang membuat kerangka kerja yang menggabungkan kode Swift dan Objective-C. Saya tidak dapat mengimpor kelas Swift di luar kerangka kerja - saya memeriksa file -Swift.h dan sedang dibuat tetapi kosong.
Masalahnya ternyata sangat, sangat sederhana - saya belum mengumumkan kelas Swift saya kepada publik! Segera setelah saya menambahkan kata kunci publik ke dalam kelas, saya dapat menggunakannya dari kelas di dalam dan di luar kerangka kerja.
Juga dari catatan, di dalam kerangka kerja (di dalam file .m hanya sebagai jawaban lain menyebutkan) saya harus mengimpor file -Swift.h sebagai:
sumber
Saya memiliki masalah yang sama. Sepertinya Anda harus menyesuaikan pengaturan (Tentukan Modul dan Nama Modul Produk) sebelum Anda menambahkan file Swift pertama Anda.
Jika Anda melakukannya setelah itu, file "* -Swift.h" tidak akan dihasilkan untuk proyek ini bahkan jika Anda menambahkan file Swift lebih lanjut atau menghapus file Swift dan membuat yang baru.
sumber
Izinkan saya untuk berbagi pengalaman saya mencoba menggunakan Swift dalam proyek objc lama. Saya tidak harus menetapkan
Defines module
untukYES
.Dalam kasus saya, saya perlu secara manual memastikan ada Header Heading objc. Hanya nama header antarmuka yang dihasilkan ada di pengaturan build saya.
Ini menyebabkan file MyApp-Swift.h dihasilkan, tetapi tanpa jejak kelas Swift saya.
Dokumentasi Apple mengatakan bahwa Anda akan diminta untuk membuat header penghubung saat menambahkan file cepat pertama Anda. Yah, tidak. Saya secara manual menambahkan
MyApp-Bridging-header.h
file dan menunjuknya di bidang "Objective-C Bridging Header". Itu membuat file MyApp-Swift.h saya menjadi penuh dengan kelas Swift saya.Docs: Mengimpor Swift ke Objective-C
sumber
Berikut adalah variasi lain dari moduleName-Swift.h yang tidak dihasilkan.
Saya memutuskan untuk memasukkan Charts IOS di proyek saya tetapi tidak ingin bergaul dengan sumber di direktori yang sama, jadi saya menempatkan folder Project Charts di sebelah folder project kode saya. Saya menyeret proyek Charts ke Bar Navigator Proyek saya dan memasukkan kerangka kerja dalam daftar Binari Tertanam target proyek saya di pengaturan proyek Umum dan mengatur saklar Embedded Content Contains Swift Code ke yes di tab Build Settings proyek saya di bagian Build Options .
File moduleName-Swift.h proyek saya tidak akan pernah menghasilkan apa pun yang disarankan sakelar atau pengaturan lain di sini. Akhirnya, dengan menggunakan metode Lou Z mencari file -Swift.h, saya melihat bahwa file Charts-Swift.h dihasilkan jauh di dalam direktori xcode Build proyek saya di Charts.framework / Header /
Solusi untuk menggunakan paket Swift ios-charts Daniel Gindi tanpa menyertakan kode dalam direktori sumber proyek saya adalah menambahkan:
Untuk modul memetakan data proyek saya.
sumber
Nama file selalu didahului dengan nama Target Anda . Ini disebut sebagai nama Produk tetapi praktis itu adalah nama target. Jadi, jika Anda ingin membuatnya untuk target baru, bersiaplah untuk mengharapkan
that_target-Swift.h
file.Salah satu cara untuk mengatasinya adalah
MY_TARGET=1
. Tambahkan ini di Pengaturan proyek-> Bangun Pengaturan-> Makro Preprocessor untuk setiap target Anda.Tambahkan baris ini dalam file PCH
Keuntungan menggunakan file PCH adalah Anda tidak harus menyertakan header di mana-mana.
Ini seharusnya bekerja dengan baik.
sumber
include
di dalamnya). Lalu saya mengimpor file baru ini dari tempat saya membutuhkannya. Saya lebih suka tidak meletakkan ini di dalam PCH atau file .h apa pun untuk menghindari ketergantungan siklik dan menggunakan header kenyamanan dalam file .m..pch
file sangat tidak disarankan . Kedua, nama file berisi nama Produk dan BUKAN nama target sama sekali. Bisa jadi kebetulan bahwa itu sama, tetapi menggunakan nama Produk!Jika Xcode benar-benar menghasilkan header -Swift.h Anda (jauh di dalam DerivedData) tetapi itu tidak merujuk ke kelas Swift Anda, pastikan Anda juga memiliki header bridging yang ditentukan. Cara saya membaca dokumen menyiratkan saya hanya perlu untuk memanggil Objective-C dari Swift, tetapi tampaknya perlu untuk memanggil Swift dari Objective-C juga.
Lihat jawaban saya: https://stackoverflow.com/a/27972946/337392
EDIT: Ini karena pengubah akses publik vs. internal, seperti yang akhirnya saya temukan dijelaskan dalam dokumen Apple: -
sumber
Menengah apa yang dimiliki banyak orang di sini, tetapi menambahkan tangkapan layar yang bersangkutan. Kode Swift dan Obj-C tentu bisa hidup bersama. Ini bukan game semua atau tidak sama sekali.
Untuk mengakses file Swift di Objective-C Anda, yang perlu Anda lakukan adalah menambahkan panggilan ini ke file Obj-C Anda (dalam file .m / implementasi):
(Di mana {product_module_name} mewakili nama modul produk proyek Anda). Daripada mencoba menebak nama modul produk Anda atau mencari tahu kasus sudut dengan spasi dan karakter khusus, cukup buka tab pengaturan build dalam proyek dan ketik "nama modul produk" - inspektur akan mengungkapkan milik Anda kepada Anda. Milik saya adalah sesuatu yang saya tidak harapkan. Lihat cuplikan layar ini jika Anda bingung.
Dan untuk membuat kode Obj-c bekerja di Swift, Anda hanya perlu menambahkan file header bridging dan mengimpor header Obj-C yang relevan di sana.
sumber
#import
?Yang paling penting adalah file ini tidak terlihat !!! Setidaknya dalam Xcode6 beta5. Tidak akan ada file seperti itu bernama "YourModule-Swift.h" di ruang kerja Anda. Pastikan Anda memiliki nama modul dan mendefinisikan set modul ke ya, dan menggunakannya di kelas Objective-C Anda.
sumber
Ok, ini semua yang benar-benar Anda butuhkan!
1.Hapus semua file cepat yang telah Anda tambahkan, dan kompilasi kodenya, tanpa kesalahan.
----------
----------
2. Pergi ke pengaturan build "Projects", dan atur nama modul produk. Proyek harus memiliki Nama Modul Produk yang tidak termasuk spasi.
----------
----------
3.Defines Module harus disetel ke Ya dalam Pengaturan Bangun, di bawah Pengemasan, dalam proyek Anda, dan bukan target!
----------
----------
4. Sekarang buat file cepat atau controller tampilan, di file-> newFile->
----------
----------
Ia akan meminta untuk membuat bridging-header, memungkinkan untuk membuatnya. Jika Anda telah menolaknya sekali, Anda harus menambahkan -Bridging-Header.h secara manual
5.Tambahkan @objc di controller, untuk memberi tahu kompiler bahwa ada beberapa file cepat, yang perlu diekspos ke ObjectiveC
----------
----------
6. Buat proyek dan impor #import "-Swift.h" di salah satu pengontrol objektif, dan itu akan bekerja! Anda dapat mengklik tombol Perintah untuk melihat file yang sebenarnya!
----------
----------
Semoga ini membantu!
sumber
Jawaban ini membahas kasus penggunaan di mana Anda mungkin sudah memiliki beberapa kode Objective-C yang memanggil kelas Swift dan kemudian Anda mulai menerima kesalahan ini.
Cara Memperbaiki Masalah
Langkah-langkah berikut pada akhirnya menyelesaikan semua masalah bagi saya. Saya membaca di atas seseorang menyebut "ayam dan telur" dan konsep itulah yang membawa saya ke prosedur ini. Proses eksplisit ini menunjukkan bahwa seseorang harus menghapus kode Objective-C yang mereferensikan kelas Swift hingga setelah header dihasilkan.
Nota Bene: Jawaban tentang mengubah spasi ke garis bawah dan Modul Menentukan menjadi YA sebagaimana diberikan di atas masih berlaku saat melakukan proses ini, seperti halnya aturan yang ditentukan dalam Dokumentasi Apple .
Bridging Header Path
Dalam satu kesalahan, file ProductModuleName-Bridging-Header.h tidak ditemukan selama proses pembuatan. Fakta ini menghasilkan kesalahan
Pemeriksaan kesalahan yang lebih dekat menunjukkan bahwa file tidak akan pernah ada di lokasi yang dijelaskan karena sebenarnya terletak di ( jalur yang salah )
'/ Pengguna / Dibagikan / Bekerja /abc/abc/abc-Memasukkan-Header.h'. pencarian cepat dari target / proyek membangun pengaturan untuk membuat koreksi secara manual dan file abc-Swift.h sekali lagi dihasilkan secara otomatis.
sumber
Anda harus mengimpor header di kelas Objective-C, yaitu:
Secara otomatis dihasilkan, pada referensi itu tertulis "File Swift apa pun di target Anda akan terlihat dalam file Objective-C .m yang berisi pernyataan impor ini."
sumber
File aktual dalam proyek ini tidak dibuat ([ProductModuleName] -Swift.h). Cmd + Klik pada impor baik menghasilkan itu on-the-fly (dan dalam-memori) sehingga Anda dapat melihat bagaimana hubungan dilakukan, atau membuka file di suatu tempat di beberapa dir cache Xcode, tetapi tidak di dir proyek.
Anda perlu mengatur properti proyek Modul Tentukan (dalam Pengaturan Bangun target) ke Ya dan jika nama modul Anda memiliki spasi atau garis - gunakan _ dalam semua impor file [ProductModuleName] -Swift.h file.
Anda dapat mengimpornya di semua file .h dan .m di mana Anda menggunakan tipe cepat atau Anda dapat mengimpornya di .pch.
Jadi jika Modul saya (proyek) bernama "Proyek Uji", saya akan mengimpornya seperti ini, dalam file .pch proyek saya (di sana):
sumber
Hanya kepala bagi siapa saja yang menggunakan "." di sana nama proyek. Xcode akan menggantikan "." dengan garis bawah "_" untuk versi Swift dari file header bridging. Anehnya Bridging-Header.h yang dihasilkan tidak menggantikan periode dengan garis bawah.
Misalnya proyek dengan nama My.Project akan memiliki nama file Bridging Header berikut.
Bridging-Header.h (Autogenerated)
My.Project-Bridging-Header.h
Swift.h
My_Project.h
Saya harap ini membantu siapa saja yang menggunakan periode dan terjebak seperti saya. File ini dapat ditemukan di lokasi berikut.
Macintosh HD / Pengguna / pengguna Perpustakaan Developer Xcode DerivedData My
Hati hati,
Jon
sumber
Proyek harus memiliki Nama Modul tidak termasuk spasi. Modul Tentukan harus diatur ke Ya dalam Pengaturan Bangun, di bawah Pengemasan. berkomentar pernyataan impor:
Jika masih Anda mengalami kesalahan dalam mengimpor "ProductModuleName-Swift.h" maka
// # import "ProductModuleName-Swift.h"
yang mengungkapkan banyak kesalahan lain dalam kode Swift saya.
Setelah saya memperbaiki kesalahan baru ini dan berhasil membangun sumber, saya menghapus komentar #import dan bingo! Header dibuat dan mengimpor dengan benar :)
sumber
Saya menemukan trik yang selalu berhasil pada saya.
Lakukan pekerjaan ini (hapus dan buat "ProductModuleName-Swift.h" dari file appDelegate.h dan bersihkan kode Anda) setiap kali Anda menerima kesalahan ini untuk membuatnya diam.
sumber
Saya Menemukan solusi ini
Sekarang kamu bisa
bukannya ProductModuleName-Swift.h
Ini solusi untuk solusi Xcode berikutnya, saya pikir masalah ini akan terpecahkan. Semoga berhasil
sumber
#import “ProductModuleName-Swift.h”
baru saja muncul dengan kesalahan dalam file SwiftBridge.h bukannya file kode Objective-C asli.Saya mengalami kesulitan menentukan impor modul saya / tujuan-c impor header swift. Saya memang membaca banyak artikel di sini juga.
Tetapi jawaban pasti untuk nama proyek Anda dengan semua karakter khusus yang disertakan (baik itu '.' Atau numerik atau spasi) - Anda dapat menemukan teks yang akan bekerja untuk Anda di " Nama Modul Produk " " di bawah Pengaturan Bangun target target. .
Misalnya nama target saya dimulai dengan angka - "1mg" dan bidang yang disebutkan di atas menunjukkan "_mg" sebagai nama modul saya.
jadi saya menggunakan #import "_mg-Swift.h" dan berhasil.
sumber
Dalam kasus saya, saya harus menetapkan target penyebaran setidaknya "OS X 10.9" dan
-Swift.h
header secara otomatis dihasilkan. Ingatlah bahwa Anda bisa mendapatkan banyak peringatan penghentian ketika Anda mengubah versi target penempatan, terutama ketika Anda memiliki basis kode Objective C yang lebih besar dan sangat besar. Dalam kasus kami, kami juga memiliki banyak pekerjaan yang harus dilakukan dalam file XIB & melihat kelas.sumber
Jika Anda dapat membangun sebuah proyek sebelumnya, tanpa masalah yang terkait dengan
“ProductModuleName-Swift.h” not found
kesalahan, dan sekarang Anda mendapatkan kesalahan buruk itu lagi, alasannya mungkin terletak pada perubahan terbaru Anda.Bagi saya ini adalah dengan
.swift
pengkodean file yang tidak disengaja . Mengembalikan perubahan dan mengembalikannya secara manual, berhasil.sumber
Ini mungkin titik yang jelas (mungkin terlalu jelas), tetapi Anda harus memiliki setidaknya satu file cepat dalam proyek untuk menghasilkan header. Jika Anda menulis kode boilerplate atau konfigurasi dengan tujuan menulis cepat nanti impor tidak akan berfungsi.
sumber
Saya harus menghapus kode cepat WatchOS2 dari proyek Objective C saya. Dan hanya setelah itu XCode menawarkan untuk menghasilkan -Swift.h
sumber
Saya memiliki masalah serupa tetapi proyek saya telah dikompilasi sebelumnya dan tiba-tiba mendapat kesalahan setelah beberapa perubahan kode file. Butuh beberapa saat untuk mencari tahu mengapa saya mendapatkan kesalahan 'File tidak ditemukan' untuk file myproject-swift.h. Perubahan kode yang saya lakukan memiliki beberapa kesalahan. Xcode tidak menunjukkan menempatkan kesalahan itu sebagai gantinya sepanjang waktu menunjukkan 'File not found error'. Kemudian mendapat salinan kode versi sebelumnya dan saya membandingkannya dengan kode baru dan menggabungkan file satu per satu. Setelah setiap penggabungan file memenuhi proyek untuk menemukan kesalahan. Jadi intinya adalah jika Anda memiliki kesalahan dalam kode Anda Xcode mungkin hanya menampilkan 'file tidak ditemukan kesalahan' untuk file myproject-swift.h. Kemungkinan besar Anda memiliki kesalahan kompilasi dalam proyek Anda. Bersihkan kesalahan itu dan itu akan berhasil.
sumber
Jika Anda menggunakan sesuatu seperti Cocoapods (dan bekerja di luar ruang kerja alih-alih proyek) cobalah membuka proyek dan membangunnya sebelum membuka ruang kerja dan bangunan. YMMV.
sumber
Terkadang Anda hanya perlu menghapus dan kemudian mengatur lagi target keanggotaan pada file obj-c .m.
sumber