Header Swift to Objective-C tidak dibuat di Xcode 6

242

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.hfile header yang seharusnya mengekspos kelas Swift ditandai @objcatau 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.

David Kristensen
sumber
5
Ya itu. Ini benar-benar bertanya di mana di XCode IDE Anda perlu melakukan sesuatu untuk mendapatkan Swift-> ObjC ini dibuat, karena itu tidak terjadi "secara default" ketika menambahkan kode Swift ke proyek ObjC yang ada.
David Kristensen
5
@Popeye saya tidak setuju. Dalam hal ini, jika Anda mengedit file dan mengkompilasi dari baris perintah, Anda tidak akan melihat masalah ini. Ini adalah IDE yang melakukan (atau seharusnya melakukan) atas nama Anda yang menjadi masalah. Ini kemungkinan besar terkait dengan pengaturan proyek, yang jelas merupakan fungsi IDE
gaige
11
@Popeye Dari dokumen (PDF) : Ketika Anda mengimpor kode Swift ke Objective-C, Anda mengandalkan file header yang dihasilkan Xcode untuk mengekspos file-file itu ke Objective-C. (Huruf tebal saya, huruf miring Apple.) Ini jelas pertanyaan tentang fitur Xcode yang membantu Anda menggunakan Swift dan Objective-C bersama-sama, dan ketiga tag itu pasti sesuai.
Caleb
3
Saya menyelesaikannya dengan bantuan gaige dan dokumentasi. Dan saya tidak hanya melemparkan tag sekitar: Dalam hal ini, file header HARUS dibuat oleh dan terlihat oleh XCode. Itu tidak, sehingga menghasilkan kesalahan.
David Kristensen
3
@Popeye Tidak ada yang salah saji - Saya menyalin kutipan langsung dari halaman 46. Anda telah menemukan bagian yang sama tetapi berbeda yang mengatakan kurang lebih hal yang sama.
Caleb

Jawaban:

165

Sekarang berhasil.

  1. Proyek harus memiliki Nama Modul Produk yang tidak termasuk spasi.
  2. Modul Tentukan harus diatur ke Ya dalam Pengaturan Bangun, di bawah Pengemasan.

Akhirnya berhasil. Terima kasih semuanya untuk bantuannya :-)

David Kristensen
sumber
64
Di Build Settingsbawah Packaging, saya Defines Modulediatur ke Yesdan saya membuat Product Module Namespasi tanpa. "* -Swift.h" tidak dihasilkan oleh XCode 6. ???
Loozie
25
Satu catatan tambahan: Saya pertama kali mencoba untuk mengatur properti yang disebutkan pada level target, dan itu tidak berhasil, file "* -Swift.h" tidak dihasilkan. Ini berhasil ketika saya mengaturnya di tingkat proyek.
Marcin
22
Saya juga mengalami masalah yang sama. Saya telah Defines Modulemenetapkan Yesuntuk proyek dan target, dan yang Product Module Nameditentukan, tanpa spasi , tapi sepertinya saya tidak bisa mendapatkan file ini dihasilkan.
Craig Otis
8
Kalau-kalau ada orang yang sama bingungnya dengan saya ... Saya harus memiliki keberuntungan buta di sini dan hanya mengimpor header, karena tidak akan melengkapi otomatis.
shawnwall
14
Anda tidak dapat mengimpor -wift pada file header (.h) hanya dalam implementasi.
zirinisp
122

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

Macduff
sumber
2
Ini benar, dan ... bagaimana jika saya perlu menggunakan kelas Swift di header objc? Saya mencoba dengan pernyataan maju, itu juga tidak berhasil.
Ixx
2
Wah, maaf, penerusan deklarasi berfungsi. Saya lupa menambahkan tanda titik koma: P
Ixx
14
Untuk pencari masa depan: di header Anda maju deklarasi dengan melakukan @class YourSwiftClass di bagian atas file .h Anda (bukannya mengimpor header payung)
rogueleaderr
4
Bagaimana jika saya perlu menggunakan Swift enum dalam file header?
jakecraige
1
Selanjutnya, jika "#import ProductModuleName-Swift.h" ada dalam file header apa pun, maka file ProductModuleName-Swift.h tidak akan dihasilkan sama sekali (pada Xcode 7.2) jadi jika sudah dihapus (misalnya dengan membersihkan build folder) maka Anda akan melihat pesan kesalahan di mana-mana bahwa file tersebut diimpor, bahkan untuk file .m, menambah kebingungan.
rene
59

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 #importpernyataan:

//#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 #importdan bingo! Header dibuat dan mengimpor dengan benar :)

petehare
sumber
Terima kasih, inilah tepatnya yang menahan saya. Setelah memperbaiki kesalahan build cepat saya baik untuk pergi. (Xcode Versi 6.1.1)
Rick Roberts
10
Ini adalah poin yang bagus dan alasan yang bagus untuk mengaktifkan pengaturan "lanjutkan setelah kesalahan" di Xcode.
Kendall Helmstetter Gelner
Itu persis kasus saya juga: hilang -Swift-h terjadi setelah perubahan yang sama dalam kode sumber cepat
Giorgio Calzolato
3
setelah melihat masalah ayam / telur saya menyadari masalah saya, analogi yang baik
d0ye
Masalah ini selalu kembali kepada saya (Xcode10) dan saya hanya menafsirkan Xcode sebagai buggy. Ini adalah jawabannya
SumakuTension
44

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):

cd ~/Library/Developer/Xcode/DerivedData
find * -iname '*Swift.h'

Akan menemukannya. Jika tidak ada dalam folder yang cocok maka Xcode tidak menghasilkannya.

Saya menggunakan Xcode Versi 6.2 (6C86e)

Lou Zell
sumber
Ini berhasil untuk saya. Saya telah berpikir bahwa autocomplete akan mengambilnya dan saya berasumsi tidak ada. Melihat di direktori beres.
Will
Terkadang melihat adalah percaya. Saya tidak bisa menyelesaikan pekerjaan sampai mengikuti jawaban yang disarankan dan kemudian menggunakan langkah-langkah ini untuk menemukan header yang dihasilkan, yang mengejutkan saya, diposting dengan -Swift.hdan bukan nama file Swift saya yang sebenarnya. Terima kasih!
Josh Habdas
Terima kasih! Menyelamatkan saya banyak waktu
estemendoza
43

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:

#import "My_Project-Swift.h"

JohnMorrison
sumber
12
Jika nama modul proyek Anda memiliki tanda hubung di dalamnya, mereka juga harus diganti dengan garis bawah. Jadi jika nama proyek Anda adalah "My-Project" gunakan #import "My_Project.h"
Jeff Ames
6
Juga, jika nama modul proyek Anda dimulai dengan angka, itu juga harus diganti dengan garis bawah. "1st Project" akan menjadi "_st_Project-Swift.h"
Danation
31

* Satu-satunya hal yang penting adalah: *

untuk menggunakan "Nama Modul Produk" yang ditentukan dalam target, diikuti oleh -Swift.h

#import <Product Module Name>-Swift.h

// in each ObjectiveC .m file having to use swift classes
// no matter in which swift files these classes sit.

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 ...

Luc-Olivier
sumber
1
Itu benar: tidak perlu untuk "Tentukan Modul" di Proyek atau di Target
Giorgio Calzolato
25

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:

#import <FrameworkName/FrameworkName-Swift.h>
Kendall Helmstetter Gelner
sumber
2
Dalam Kerangka Saya juga mencatat bahwa untuk menggunakan kelas Swift, mereka harus diwarisi dari NSObject (bahkan @objc tidak akan membantu) dan semua metode / properti harus publik.
dmitrynikolaev
3
Setidaknya dalam pra-rilis XCode 7 saat ini, sampai Anda mewarisi dari NSObject, mereka tidak akan tersedia di header swift yang dihasilkan.
dmitrynikolaev
100% TIDAK memperbaiki masalah saya. SETIAP solusinya adalah "buat kelas Anda menjadi publik". Saya melakukan ini. Titik. Masih TIDAK mengungkapkan kelas Swift dalam proyek yang menggunakan kerangka kerja.
datWooWoo
@lespommes, Anda harus menulis pertanyaan dan membuat contoh proyek di suatu tempat yang menunjukkan masalah, seseorang dapat mengetahui apa yang sedang terjadi ... Saya hanya memberikan jawaban saya sebagai salah satu solusi yang mungkin, karena kesalahan visibilitas yang saya buat paling sering.
Kendall Helmstetter Gelner
2
Oh ya, petunjuk Anda dengan impor akhirnya berhasil bagi saya! Terima kasih banyak!
endowzoner
14

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.

pengguna3540830
sumber
Saya tidak yakin itu benar. Saya tidak memutuskan untuk mengaktifkan 'Defines Module' sampai setelah membuat banyak file cepat dan saya bisa mendapatkan -Swift.h baik-baik saja.
Michael Peterson
Saya sebenarnya sedih melaporkan ini persis masalah yang saya miliki :( Saya harus menghapus .swift dan menambahkan kembali, dan kemudian semuanya berhasil.
StuFF mc
2
Sekarang apa? Saya sedang mengganti kode Swift dan ObjC. Project-Swift.h saya tidak diperbarui. Saya bahkan mencoba menghapus file header.
Suhail Bhat
2
Aku harus menulis satu sampai ini, dev.iachieved.it/iachievedit/?p=980 . Kiat memperbarui pengaturan bangunan sebelum menambahkan file Swift adalah kunci bagi saya.
Joe
Apakah ini berarti saya harus membuat ulang proyek dan menambahkan kembali semuanya jika saya tidak melakukan ini? Apa pun yang saya lakukan, sepertinya saya tidak bisa mendapatkan file * -Swift.h yang akan dihasilkan.
kgreenek
13

Izinkan saya untuk berbagi pengalaman saya mencoba menggunakan Swift dalam proyek objc lama. Saya tidak harus menetapkan Defines moduleuntuk YES.

Dalam kasus saya, saya perlu secara manual memastikan ada Header Heading objc. Hanya nama header antarmuka yang dihasilkan ada di pengaturan build saya.

Heading bridging tidak ada

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.hfile 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

Nicolai Dahl
sumber
ya, untuk alasan apa pun file ObjC Swift.h saya dihasilkan dengan header kelas Swift hanya setelah saya menambahkan file header bridging kosong ke proyek!
Andrew
Sama disini. Kode Swift saya tidak diimpor ke file * -Swift.h yang dihasilkan hingga saya menambahkan file header bridging Objective-C kosong.
Nik
12

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:

#import "Charts/Charts-Swift.h"

Untuk modul memetakan data proyek saya.

gjpc
sumber
Apakah mungkin untuk mengubah / menyesuaikan tip alat di grafik iOS? jika ya maka bisakah Anda memberikan satu contoh?
Amit Chauhan
12

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.hfile.

Salah satu cara untuk mengatasinya adalah

  1. Tambahkan preprocessor untuk setiap target Anda yang merupakan nama target Anda sendiri (tanpa spasi). Ex. MY_TARGET=1. Tambahkan ini di Pengaturan proyek-> Bangun Pengaturan-> Makro Preprocessor untuk setiap target Anda.
  2. Jika Anda menggunakan file PCH,

Tambahkan baris ini dalam file PCH

#if MY_TARGET==1
#include "My_Target-Swift.h"
#elif THAT_TARGET==1
#include "That_Target-Swift.h" 
#endif

Keuntungan menggunakan file PCH adalah Anda tidak harus menyertakan header di mana-mana.

  1. Jika Anda tidak menggunakan file PCH, tambahkan saja baris yang sama ini dalam satu header dan sertakan header itu di mana pun Anda perlu menggunakan kelas cepat.

Ini seharusnya bekerja dengan baik.

Deepak GM
sumber
Saya sangat suka menggunakan solusi ini daripada mengimpor header langsung ke sumber Anda. Saya memiliki struktur proyek yang rumit di mana kode sumber yang sama digunakan oleh beberapa target / proyek. Ini menghindari menambahkan pernyataan #if #else yang berantakan di seluruh kode saya. Terima kasih atas jawabannya!
Ryan
Ini menyelamatkan hari saya. Saya menempatkan 5 baris kode dalam file "Sesuatu-Swift-Headers.h" (dengan includedi 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.
ctietze
Ini salah pada banyak tingkatan. Pertama, .pchfile 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!
Iulian Onofrei
10

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: -

Secara default, header yang dihasilkan berisi antarmuka untuk deklarasi Swift yang ditandai dengan pengubah publik. Ini juga berisi yang ditandai dengan pengubah internal jika target aplikasi Anda memiliki header bridging Objective-C.

Eselon
sumber
Ya, ini sangat membantu. Saya tidak tahu itu. Saya pikir, itu hanya diperlukan untuk Obj-C dari Swift use-case.
nodepond
Saya senang bisa membantu. Saya telah mengedit jawabannya karena sejak itu saya menemukan alasan untuk perilaku ini.
Eselon
7

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):

#import "{product_module_name}-Swift.h"

(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.

masukkan deskripsi gambar di sini

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.

Brian Sachetta
sumber
1
Bukankah seharusnya begitu #import?
Iulian Onofrei
Katakanlah nama proyek saya adalah ABC, maka "ABC-Swift.h", harus ada di proyek saya, kan? Saya tidak dapat menemukannya. Apakah perlu membuatnya secara manual? Saya tidak membuat file cepat sendiri, hanya termasuk pod kakao yang ditulis dengan cepat.
nr5
Bridging Header (dalam kasus Anda, ABC-Swift.h) tidak dibuat secara otomatis. Ketika Anda mencoba membuat file Swift pertama Anda dalam proyek Obj-C, Xcode biasanya meminta Anda untuk menambahkannya. Anda juga dapat membuat header Bridging sendiri seperti yang ditunjukkan di sini (kontrol + f untuk 'header bridging'): developer.apple.com/library/content/documentation/Swift/…
Brian Sachetta
5

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.

pengguna412759
sumber
5

Ok, ini semua yang benar-benar Anda butuhkan!

1.Hapus semua file cepat yang telah Anda tambahkan, dan kompilasi kodenya, tanpa kesalahan.

----------

masukkan deskripsi gambar di sini

----------

2. Pergi ke pengaturan build "Projects", dan atur nama modul produk. Proyek harus memiliki Nama Modul Produk yang tidak termasuk spasi.

----------

masukkan deskripsi gambar di sini

----------

3.Defines Module harus disetel ke Ya dalam Pengaturan Bangun, di bawah Pengemasan, dalam proyek Anda, dan bukan target!

----------

masukkan deskripsi gambar di sini

----------

4. Sekarang buat file cepat atau controller tampilan, di file-> newFile->

----------

masukkan deskripsi gambar di sini

----------

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

----------

masukkan deskripsi gambar di sini

----------

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!

----------

masukkan deskripsi gambar di sini

----------

Semoga ini membantu!

Kakshil Shah
sumber
>> Anda dapat mengklik Perintah untuk melihat file yang sebenarnya! Ini keren
Jagan
4

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.

  1. Komentari pernyataan #import "ProductModuleName-Swift.h" di file implementasi Objective-C Anda
  2. Komentari referensi apa pun dalam file implementasi Objective-C ke Swift Classes
  3. Bersihkan & Bangun
  4. Atasi semua kesalahan / peringatan
  5. Hapus komentar pada pernyataan #import "ProductModuleName-Swift.h"
  6. Bersihkan & bangun (berhasil atau memperbaiki kesalahan yang tersisa, verifikasi bahwa Anda tidak mereferensikan kelas Swift apa pun di Objective-C pada titik ini . Jika demikian, berikan komentar untuk sementara waktu)
  7. Verifikasi bahwa "ProductModuleName-Swift.h" dihasilkan oleh Cmd-Mengklik pada nama kelas pernyataan #import "ProductModuleName-Swift.h"
  8. Hapus komentar pada kode referensi kelas Swift di file implementasi Objective-C.
  9. Bersihkan & Bangun seperti biasa ("ProductModuleName-Swift.h" harus dibuat dan kode Objective-C Anda yang merujuk pada Kelas Swift dapat digunakan seperti biasa)

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

<tidak diketahui>: 0: kesalahan: bridging header '/Users/Shared/Working/abc/abc-Bridging-Header.h' tidak ada

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.

membangun-pengaturan

Tommie C.
sumber
1
Bagaimana jika proyek Anda begitu besar sehingga mengomentari semua referensi kode cepat dalam tujuan c tidak praktis?
Andrew Morris
3

Anda harus mengimpor header di kelas Objective-C, yaitu:

#import “ProductModuleName-Swift.h”

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."

Anton
sumber
24
Tetapi, ketika saya melakukan itu, saya mendapatkan galat build, AppName-Swift.h tidak ada. Padahal, AppName-Bridging-Header.h memang ada.
David Kristensen
5
@DavidKristensen: Apakah Anda mendapatkan solusinya ?, karena saya terjebak dengan masalah yang sama
BaSha
2

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):

#import "Test_Project-Swift.h"
Nikolay Tsenkov
sumber
2

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

jonthornham
sumber
2

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 :)

j.krissa
sumber
Masalah saya adalah bahwa saya memiliki kesalahan dalam kode Swift saya juga, tetapi tidak mengetahuinya sampai saya membatalkan komentar file -Swift.h. Terima kasih!
Will
1

Saya menemukan trik yang selalu berhasil pada saya.

  1. Buat #import "ProductModuleName-Swift.h" Anda di file appDelegate.h Anda dan di file ProductName-Prefix.pch Anda. Jika Anda tidak memilikinya di xcode 6 Anda dapat membuatnya dengan cara ini. Mengapa ProjectName-Prefix.pch tidak dibuat secara otomatis di Xcode 6?
  2. Command + shift + k untuk membersihkan kode Anda, jika Anda menerima kesalahan tentang "ProductModuleName-Swift.h" Anda hapus dari file appDelegate.h.
  3. Bersihkan kode Anda lagi. Sekarang semuanya akan bekerja seperti pesona
  4. Jika Anda menerima lagi kesalahan tentang "ProductModuleName-Swift.h", sekarang buat lagi di file appDelegate.h dan bersihkan kode Anda lagi.

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.

yannisalexiou
sumber
1

Saya Menemukan solusi ini

  • Buat SwiftBridge.h
  • masukkan #import “ProductModuleName-Swift.h”
  • Jadikan file .h ini publik (penting) Pilih file -> Di Perlihatkan file Inspektur (bilah kanan) -> Jadikan publik

Sekarang kamu bisa

#import "SwiftBridge.h"

bukannya ProductModuleName-Swift.h

Ini solusi untuk solusi Xcode berikutnya, saya pikir masalah ini akan terpecahkan. Semoga berhasil

Tot FOURLEAF
sumber
Tidak bekerja Baru saja mencobanya. Baris #import “ProductModuleName-Swift.h”baru saja muncul dengan kesalahan dalam file SwiftBridge.h bukannya file kode Objective-C asli.
Supertecnoboff
1

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.

Nama Modul Produk dalam pengaturan target membangun memberikan nama modul yang benar yang akan bekerja untuk proyek Anda

Keroberos
sumber
Jika Anda dapat mengedit tautan ke tangkapan layar, saya dapat mengedit jawaban Anda untuk menampilkannya untuk Anda.
SuperBiasedMan
1

Dalam kasus saya, saya harus menetapkan target penyebaran setidaknya "OS X 10.9" dan -Swift.hheader 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.

Rafael Bugajewski
sumber
2
Untuk yang lain - lihat di Pengaturan Bangun untuk target Anda, dapatkan nama yang tepat "MyProject-Swift.h" - itulah yang perlu Anda sertakan sebagai "#sertakan" MyProject-Swift.h "dalam file Objc yang sesuai. BTW, ini Jawabannya sangat membantu saya - bekerja untuk mengubah beberapa sumber terbuka ObjectiveC yang lebih tua
David H
0

Jika Anda dapat membangun sebuah proyek sebelumnya, tanpa masalah yang terkait dengan “ProductModuleName-Swift.h” not foundkesalahan, dan sekarang Anda mendapatkan kesalahan buruk itu lagi, alasannya mungkin terletak pada perubahan terbaru Anda.

Bagi saya ini adalah dengan .swiftpengkodean file yang tidak disengaja . Mengembalikan perubahan dan mengembalikannya secara manual, berhasil.

Yevhen Dubinin
sumber
0

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.

Alex Brown
sumber
0

Saya harus menghapus kode cepat WatchOS2 dari proyek Objective C saya. Dan hanya setelah itu XCode menawarkan untuk menghasilkan -Swift.h

Andrew Marin
sumber
0

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.

Ram G.
sumber
0

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.

Warpling
sumber
0

Terkadang Anda hanya perlu menghapus dan kemudian mengatur lagi target keanggotaan pada file obj-c .m.

valeCocoa
sumber