Mengimpor Project-Swift.h ke file Objective-C class… tidak ditemukan

128

Saya memiliki proyek yang dimulai pada Objective-C, dan saya mencoba untuk mengimpor beberapa kode Swift ke file kelas yang sama yang sebelumnya saya tulis Objective-C di.

Saya telah berkonsultasi dengan Apple docs tentang penggunaan Swift dan Objective-C dalam proyek yang sama, serta pertanyaan SO seperti ini, tetapi tetap tidak berhasil: Saya terus mendapatkan file yang tidak ditemukan kesalahan setelah memasukkan #import "NewTestApp-Swift.h"( NewTestAppadalah nama Produk) dan modul).

Inilah yang telah saya lakukan sejauh ini:

  1. Di Define Modules, dipilih YESuntuk aplikasi.
  2. Memastikan bahwa nama Modul Produk tidak memiliki ruang di dalamnya (lihat tangkapan layar di bawah pertanyaan)

Saya telah mencoba menggunakan #import "NewTestApp-Swift.h"dalam ViewController.m, ViewController.hdan AppDelegate.mnamun tidak satupun dari mereka telah bekerja.

Apa lagi yang saya lakukan salah? Terima kasih atas bantuan Anda.


Tangkapan layar pengaturan:

masukkan deskripsi gambar di sini


Kesalahan yang saya temui saat ini:

masukkan deskripsi gambar di sini

daspianis
sumber
3
Hapus semua Data yang Diperoleh dalam ~/Library/Developer/Xcode/DerivedDatamelakukan trik untuk saya.
wzhang84
Inilah cara saya memecahkan masalah: stackoverflow.com/a/45338549/8102549
schrulnz

Jawaban:

158

Saya mengalami masalah yang sama dan tidak bisa membuat proyek saya mengimpor cepat ke kelas obj-c. Menggunakan Xcode 6, (harus berfungsi untuk Xcode 6+) dan dapat melakukannya dengan cara ini ....

  1. Setiap kelas yang perlu Anda akses dalam file .h harus berupa deklarasi maju seperti ini

@class MySwiftClass;

  1. Dalam file .m HANYA, jika kode dalam proyek yang sama (modul) maka Anda perlu mengimpornya

#import "ProductModuleName-Swift.h"

Tautan ke dokumentasi apel tentang hal itu

https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/importing_swift_into_objective-c

bolnad
sumber
3
Terima kasih atas jawabannya. Itu membawa saya ke arah yang benar. Saya memiliki masalah yang sama tetapi dengan protokol sehingga saya harus menambahkan @protocol MySwiftProtocol alih-alih impor dalam file header saya.
Palme
dalam file .h maju pernyataan kelas tanpa memohon file .h melakukan trik untuk saya. Terima kasih
Sikander
1
Perhatikan bahwa jika nama produk Anda memiliki -karakter di dalamnya, nama file header yang dihasilkan akan dikonversi ke _. mis. jika nama produk My-AppAnda, Anda akan mengimpor My_App-Swift.h.
dvanoni
1
Saya menemukan cara baru untuk menemukan nama file header yang dihasilkan dengan benar: buka target Anda -> Bangun Pengaturan -> Cari kata kunciObjective-C Generated Interface Header Name , bingo!
Itachi
2
Saya sudah melakukan kedua hal ini, dan saya masih melihat masalah yang sama. Apakah Anda pikir itu ada hubungannya dengan pesanan?
ArielSD
83

Jika kode Swift ada di dalam Modul (seperti pada kasus Anda):

#import <ProductName/ProductModuleName-Swift.h>

Jika kode Swift ada di dalam proyek (campuran Swift dan ObjC):

#import <ProductModuleName-Swift.h>

Dalam kasus Anda, Anda harus menambahkan baris ini di file * .m:

#import <NewTestApp/NewTestApp-Swift.h>

PENTING: lihat "<" dalam pernyataan impor

https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html

ikocel1
sumber
Terima kasih telah menjawab @ ikocel1. Sayangnya ini tidak berhasil. Saya sudah mencoba variasi <NewTestApp-Swift/NewTestApp-Swift.h>, <NewTestApp/NewTestApp-Swift.h>dan <NewTestApp/ViewController-Swift.h>semuanya di dalam ViewController.m, tetapi terus mendapatkan kesalahan "file tidak ditemukan", meskipun Cleaningproyek setiap kali setelah mencoba kombinasi. Saya telah menyertakan tangkapan layar di badan pertanyaan jika itu membantu.
daspianist
Saya belum memasukkan kode Swift apa pun ke ViewController.m. Saya hanya mencoba mengimpor header terlebih dahulu untuk mencoba membuatnya menerima kode Swift. Saya akan mencampur dan mencocokkan kode Objective-C dan Swift ViewController.m.
daspianist
1
Saya tidak tahu apakah mungkin untuk mencampur langsung kode objc dan kode cepat dalam file yang sama.
ikocel1
1
Terima kasih, saya kira ini adalah asumsi yang saya miliki berdasarkan dokumen "Mix and Match" Apple .. tapi saya rasa tidak ada di dalam file yang sebenarnya. Terima kasih!
daspianist
6
Saya tidak mengerti mengapa jawaban ini disetujui. Ya, benar mengikuti dokumentasi tetapi praktis tidak bekerja untuk saya juga. Bahkan dalam pertanyaan itu jelas bahwa pengguna menggunakan sintaksis seperti yang disarankan pada jawaban ini tetapi masih mendapat kesalahan.
Darius Miliauskas
54

Bagaimana saya berhasil mengimpor swift ke objektif-c:

  • Menentukan Modul yang disetel ke YA (di proyek - tidak tepat sasaran)
  • Set Nama Modul Produk (sesuai target - bukan di proyek)
  • Di ViewController.m Anda mengimpor kode cepat dengan:

    #import "MyProductModuleName-Swift.h"
  • Tambahkan file cepat ke proyek objektif-c Anda (File -> Baru -> Cepat) dan Xcode akan membuat header penghubung dari objektif-c ke Swift tetapi ini sangat penting untuk membuatnya bekerja sebaliknya juga - tampaknya.

Untuk bagian terakhir dari teka-teki ini terima kasih kepada Swiftoverload karena membuat saya sadar benar-benar menambahkan file Swift melalui Xcode GUI dan tidak hanya menyeret dan menjatuhkan file swift yang ada ke proyek saya untuk membuatnya bekerja: http://nikolakirev.com/blog / Menggunakan proyek swift-in-objective-c

holm50
sumber
Catatan yang sangat baik. Saya akan menambahkan bahwa target pengujian adalah modulnya sendiri dan akan memiliki header sendiri bernama "<#TestTargetName #> - Swift.h" dan bahwa setiap spasi dalam nama target akan dikonversi menjadi spasi.
Chuck Krutsinger
@ holm51 maaf untuk menanyakan ini, tetapi di mana Define ModuledanProduct Module Name ?
matchifang
tanda hubung -dalam nama akan dikonversi menjadi garis bawah _juga
CyberMew
11

Menggunakan Xcode 8.2.1 dan jika Anda melihat Project > Build Settings> Objecter-C Generated Interface Header Name , di sana hanya ada satu file header yang dinamai seperti Product -Swift.h

Ini berarti bahwa alih-alih mengimpor setiap modul secara terpisah dari file Objective-C .m, menggunakan file individual -Swift.h, Anda hanya mengimpor satu modul Produk -Swift.h yang mengumpulkan semua modul Swift.

Saya mengalami masalah yang sama dengan mencari cara tradisional mengimpor modul secara terpisah, tetapi versi Xcode dan Swift 3 saat ini mengubahnya untuk menggunakan hanya satu header untuk semua modul yang mengimpor.

petershine
sumber
hai peter, di mana Anda dapat menemukan file ini? Atau apakah itu dibuat secara otomatis oleh xcode? Juga, apakah Anda harus mengatur podfile Anda secara berbeda karena perubahan ini?
Rob Norback
@RobNorback Jika saya tidak salah, Anda bisa menulis 'impor "Produk-Swift.h" di file header / implementasi Obj-C untuk melihat efeknya, tanpa melakukan apa-apa ekstra. Pastikan pengaturan proyek Anda memiliki setiap konfigurasi yang diaktifkan untuk pencampuran Swift dan Obj-C. Juga, saya masih belum mengalami masalah dengan Podfile. Tolong beri tahu saya jika saya melihat sesuatu secara berbeda.
petershine
Terima kasih, saya telah menghabiskan berjam-jam mencoba men-debug ini, dan masalahnya memang masing-masing modul dalam proyek saya menghasilkan -Swift.hfile header mereka sendiri . Memaksa mereka semua (saya punya 5 target) untuk menggunakan file header umum memperbaiki masalah bagi saya.
Apoorv Khatreja
@ApoorvKhatreja bagaimana Anda memaksa mereka untuk melakukan itu? Menulis nama file secara eksplisit?
Amit Raz
8

Menghabiskan satu jam untuk masalah ini, mengikuti langkah-langkah ini akan membantu Anda memahami apa yang hilang:

  1. Buka preferensi Xcode dan navigasikan ke folder DerivedData
  2. Cari "swift.h" di finder
  3. Jika Anda tidak dapat menemukan file project-swift.h, file ini belum dibuat. Anda biasanya perlu menambahkan @objc ke salah satu kelas cepat Anda dan berhasil membangun aplikasi, hanya dengan Xcode akan menghasilkan file ini
  4. Jika Anda menemukan file "xxx-swift.h", pastikan pernyataan impor Anda berisi nama yang benar.

bagaimana-untuk-menemukan-file cepat

Jakehao
sumber
Tolong jangan tambahkan jawaban yang sama untuk beberapa pertanyaan . Jawab yang terbaik dan tandai sisanya sebagai duplikat, setelah Anda mendapatkan reputasi yang cukup. Jika ini bukan duplikat, sesuaikan pos dengan pertanyaan dan beri tanda penghapusan.
Bhargav Rao
Terima kasih untuk ini! Saya mengubah nama diplay aplikasi saya (bukan target) dan header Swift juga berubah nama. Ini adalah satu-satunya cara saya dapat menemukan apa yang sedang terjadi.
Lucas P.
Terima kasih telah mengirim jawaban. Tangkapan layar dan formulir titik tepat segera membuat saya gulir kembali + melihat + mengakhiri pencarian saya ... masalah terpecahkan!
dklt
6

Saya mengalami masalah saat mengimpor Swift ke proyek Objective-C. Pada akhirnya saya melihat ke folder Data Derivied untuk memeriksa apa yang dihasilkan Xcode 7. Nama file benar-benar berbeda dengan yang saya harapkan.

Setelah saya memiliki nama file yang sebenarnya saya impor itu dan proyek dapat dibangun.

Josh B
sumber
2
Di mana file ini berada? Saya melihat-lihat di sana dan tidak dapat menemukan apa pun
Amit Raz
5

-Swift.hharus dibuat oleh Xcode secara otomatis jika kode Swift mengekspos API melalui @objcatau @objcMembers[Tentang]

Biasanya terlihat seperti lokasi

~/Library/Developer/Xcode/DerivedData/
  ProductModuleName-foo/
    Build/
      Intermediates.noindex/
        ProductModuleName.build/
          Debug-iphoneos/
            ProductModuleName.build/
              DerivedSources/
                ProductModuleName-Swift.h

Itu bisa diubah oleh

Project editor -> select a target -> Build Settings -> Per-configuration Intermediate Build Files Path

Secara default nilainya adalah $(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)

yoAlex5
sumber
2

DEFINE MODULES: YES dan impor "ProjectName-Swift.h" dalam file .m dari kelas Obj-C

Ini berhasil bagi saya untuk mengakses kelas Swift di Obj-c.

Penggemar YSR
sumber
3
Tetapi bagaimana cara mengimpornya ke file .h jika saya perlu kelas swift di header objc?
Alexander Danilov
1

Pernah menghadapi masalah yang sama dengan tim saya ketika sedang mengerjakan proyek menggunakan git. Satu pengembang belum memperbarui Xcode ke versi terakhir (7.3) yang diperlukan untuk versi Swift 2.2 terbaru. Jadi, kompiler belum mengenali sintaks Swift baru dan tidak dapat menghasilkan antarmuka untuk pustaka Swift (projectname-swift.h). Periksa apakah versi Xcode adalah yang terbaru!

Artem Loginov
sumber
Saya kasus saya, saya menghadapi masalah karena telah memutuskan untuk menunda migrasi ke Swift 3 yang ditawarkan oleh Xcode. Akibatnya Xcode tidak dapat membangun file sumber Swift dan tidak menghasilkan header untuk disertakan.
iutinvg
1

Selama pengembangan, mungkin ada kemungkinan Anda memiliki kelas swift yang tidak sepenuhnya diimplementasikan karena yang mungkin ada beberapa kesalahan sintaksis. File header cepat akan tersedia untuk digunakan hanya jika semua file cepat gratis dari kesalahan.

Pastikan tidak ada kesalahan sintaks pada file swift dan kemudian coba impor header swift pada file objektif - c

Gurunath Sripad
sumber
1

Mengimpor file header, yaitu

#import "<ProjectName>-Swift.h" 

dalam file .h menghasilkan kesalahan, menyatakan:

File -Swift.h 'tidak ditemukan

dan build gagal.

Alih-alih gunakan:

#import "<ProjectName>-Swift.h"

dalam file .m, dan meskipun kesalahan yang sama muncul, menjalankan proyek tetap menekan kesalahan.

Kelas cepat kemudian tersedia dalam file .m.

Claytog
sumber
1

Saya menghadapi masalah dengan nama proyek (target). Itu termasuk simbol "-". Jadi keputusannya adalah berikutnya: jika nama proyek adalah "Test-App", maka nama kelas yang diimpor adalah "Test_App-Swift.h"

opochtovy
sumber
solusi luar biasa
iOS Lifee
1

Jika nama Aplikasi Anda memiliki karakter khusus, gunakan _ untuk karakter khusus.

Sebagai Contoh jika nama Aplikasi Anda adalah Nama "Test App®"

Kemudian Anda dapat mengimpor file cepat dengan "Test_App_-Swift.h".

Space and ® diganti oleh _ saat Anda mengimpor.

Teknologi Silversky
sumber
0

Jika Anda memiliki banyak target, pastikan Anda telah membangun semua kerangka kerja

Same7Farouk
sumber
0

Xcode 11

Saya mengalami masalah ini ketika membangun Xcode 11. Butuh sedikit waktu untuk mencari tahu apa yang salah, tetapi pada dasarnya, saya telah mengubah pengaturan "Nama Tampilan" pada tab "Umum" Target alih-alih mengubah langsung di Info.plist file melalui "Info" tab pada Target.

Ini menghasilkan Xcode 11.5 melalui penulisan ulang / pembuatan banyak pengaturan pembuatan kustom baru dan memodifikasi nama modul aplikasi dan produk .app yang dibuat. Dalam hal ini nama tampilan baru ini juga memiliki garis miring ( /) karakter di dalamnya yang pada akhirnya mungkin mengapa hal itu tidak membangun (lihat @Silversky Teknologi 's jawabannya ).

Apapun, saya menyelesaikan ini dengan membatalkan semua perubahan otomatis Xcode 11.5 untuk file proyek dan secara manual membuat perubahan yang sama dengan nama tampilan bundel di Info.plist file dan semuanya berfungsi dengan baik.

Saya berharap itu akan memberitahu Anda bahwa itu melakukan hal-hal seperti ini sebelum naik dan melakukannya tanpa persetujuan Anda.

Beltalowda
sumber
0

Pastikan kelas cepat Anda memiliki deklarasi publik, dan perpanjang NSObject:

public class MySwiftClass: NSObject {
    //...
}

Impor harus bekerja dengan tanda kutip, bukan tanda kurung, jika kelas swift berada di proyek yang sama.

Pita Michael
sumber
0

jika Anda menambahkan File Swift terlebih dahulu, ingatlah untuk menambahkan file swift ke target Anda ..., di kolom kiri

YitroYe
sumber