Saya mencoba mengintegrasikan Swift
kode dalam aplikasi saya. Aplikasi saya ditulis Objective-C
dan saya menambahkan sebuah Swift
kelas. Saya telah melakukan semua yang dijelaskan di sini . Tapi masalah saya adalah yang Xcode
belum membuat -Swift.h
file, hanya header bridging. Jadi saya membuatnya, tetapi sebenarnya kosong. Saya dapat menggunakan semua kelas ObjC saya di Swift, tetapi saya tidak bisa melakukannya sebaliknya. Saya menandai kelas cepat saya dengan @objc
tetapi tidak membantu. Apa yang bisa saya lakukan sekarang?
EDIT: Apple mengatakan: "Ketika Anda mengimpor kode Swift ke Objective-C, Anda mengandalkan Xcode-generated
file header untuk mengekspos file-file itu ke Objective-C. [...] Nama header ini adalah nama modul produk Anda diikuti dengan menambahkan" -Swift.h "."
Sekarang ketika saya ingin mengimpor File itu, ia memberikan kesalahan:
//MainMenu.m
#import "myProjectModule-Swift.h" //Error: 'myProjectModule-Swift.h' file not found
@implementation MainMenu
Ini file FBManager.swift saya:
@objc class FBManager: NSObject {
var descr = "FBManager class"
init() {
super.init()
}
func desc(){
println(descr)
}
func getSharedGameState() -> GameState{
return GameState.sharedGameState() //OK! GameState is written in Objective-C and no error here
}
}
sumber
YourProjectName-Swift.h
harus menjadi file header ajaib yang Xcode buat secara otomatis untuk Anda selama kompilasi (Anda tidak akan benar-benar melihatnya di browser proyek). Coba hapus yang Anda buat, dan tambahkan#import YourProjectName-Swift.h
ke file di mana Anda ingin menggunakan kelas Swift.myProjectModule
? The-Swift.h
file harus dimulai dengan nama aplikasi Anda. Apakah Anda memiliki file yang diakhiri-Bridging-Header.h
? Kamu harus. Jika demikian, bagian pertama dari file itu adalah nama proyek Anda. Gabungkan bagian pertama dari nama file itu-Swift.h
dan itu yang harus Anda sertakan.-Swift.h
ditemukan di Mac saya, namun saya dapat memasukkannya. Jadi jangan terpaku mencari file seperti itu. Pastikan Anda memberi nama dengan benar.#import <MyProjectName/MyProjectName-Swift.h>
Jawaban:
Saya menghabiskan sekitar 4 jam mencoba mengaktifkan
Swift
diXcode
proyek berbasis Objective-C saya .myproject-Swift.h
File saya berhasil dibuat, tetapi file sayaXcode
tidak melihat file sayaSwift-classes
. Jadi, saya memutuskan untuk membuatXcode
proyek berbasis Objc baru dan akhirnya, saya menemukan jawaban yang tepat! Semoga postingan ini akan membantu seseorang :-)Langkah demi langkah Integrasi cepat untuk proyek berbasis Xcode Objc:
*.swift
file baru (dalam Xcode) atau tambahkan dengan menggunakan Finder.Objective-C bridging header
ketika Xcode bertanya tentang hal itu.Terapkan kelas Swift Anda:
Buka Pengaturan Bangun dan periksa parameter ini:
YES
myproject
YES
myproject-Swift.h
$(SRCROOT)/myproject-Bridging-Header.h
Impor header antarmuka Swift di file * .m Anda.
sumber
"myproject-Swift.h"
sehingga sepertinya saya tidak berfungsi. Rupanya, file ini tidak terlihat di navigator proyek.#import "myproject-Swift.h"
.Jangan membuat file header sendiri. Hapus yang Anda buat.
Pastikan kelas Swift Anda ditandai dengan
@objc
atau mewarisi dari kelas yang berasal (langsung atau tidak langsung) dariNSObject
.Xcode tidak akan menghasilkan file jika Anda memiliki kesalahan kompiler dalam proyek Anda - pastikan proyek Anda dibangun dengan bersih.
sumber
find ~/library/Developer/Xcode/DerivedData/ -name "*-Swift.h"|xargs basename|sort -u
untuk melihat apakah file itu dibuat dengan nama yang tidak terduga seperti untuk saya. :)Izinkan Xcode melakukan tugasnya, jangan tambahkan / buat sundulan Swift secara manual. Cukup tambahkan @objc sebelum ex Swift class Anda.
Dalam pengaturan proyek Anda cari bendera di bawah ini dan ubah menjadi YA (Baik Proyek dan Target)
Kemudian bersihkan proyek dan bangun satu kali, setelah build berhasil (mungkin seharusnya) impor file header di bawah ini di file objektif-c Anda .m
Boooom!
sumber
Basic
keAll
di bilah atas.Embedded Content Contains Swift
diubah menjadiAlways Embed Swift Standard Libraries
dengan Xcode 8: stackoverflow.com/questions/38792650/…Juga mungkin bermanfaat bagi Anda dengan target Kerangka :
The pernyataan impor dari auto-generated file header terlihat berbeda sedikit dari target aplikasi. Selain hal-hal lain yang disebutkan dalam jawaban lain gunakan
dari pada
sesuai dokumentasi Apel pada Mix & Match untuk target kerangka kerja.
sumber
Pastikan proyek Anda mendefinisikan modul dan Anda telah memberi nama pada modul tersebut. Kemudian bangun kembali, dan Xcode akan membuat
-Swift.h
file header dan Anda akan dapat mengimpor.Anda dapat mengatur definisi modul dan nama modul dalam pengaturan proyek Anda.
sumber
Detail: Proyek Objective-C dengan kode Swift 3 di Xcode 8.1
Tugas:
SAMPEL PENUH
1. Kelas Objective-C yang menggunakan Swift enum
Deteksi kode Swift dalam kode Objective-C
Dalam sampel saya, saya menggunakan SwiftCode.h untuk mendeteksi kode Swift di Objective-C. File ini menghasilkan secara otomatis (saya tidak membuat salinan fisik file header ini dalam suatu proyek), dan Anda hanya dapat menetapkan nama file ini:
2. Kelas Swift yang menggunakan Objective-C enum
Deteksi kode Objective-C dalam kode Swift
Anda harus membuat bridging header file. Ketika Anda menambahkan file Swift di proyek Objective-C, atau file Objective-C di proyek swift Xcode akan menyarankan Anda untuk membuat header penghubung.
Anda dapat mengubah menjembatani nama file header di sini:
Pemakaian
Hasil
LEBIH BANYAK SAMPEL
3. Panggil kelas Swift dari kode Objective-c
Hasil
4. Panggil kelas Objective-c dari kode Swift
Hasil
5. Gunakan ekstensi Swift dalam kode Objective-c
6. Gunakan ekstensi Objective-c dalam kode cepat
sumber
@objcMembers
di depan kelas. Karena@objc
inferensi telah dikurangi di Swift 4 untuk keperluan optimasi. Misalnya, properti dalam kelas yang diturunkan dari NSObject, tidak akan lagi menyimpulkan @objc secara default (seperti yang terjadi pada Swift 3). Saya mendapatkan intel ini dari jawaban ini .Saya memiliki masalah yang sama dan ternyata simbol-simbol khusus dalam nama modul diganti dengan xcode (dalam kasus saya tanda hubung akhirnya menjadi garis bawah). Dalam pengaturan proyek, periksa "nama modul" untuk menemukan nama modul untuk proyek Anda. Setelah itu gunakan
ModuleName-Swift.h
atau ganti nama modul dalam pengaturan.sumber
File dibuat secara otomatis (berbicara tentang Xcode 6.3.2 di sini). Tapi Anda tidak akan melihatnya, karena ada di folder Data Turunan Anda. Setelah menandai kelas cepat Anda dengan
@objc
, kompilasi, lalu cariSwift.h
di folder Data Turunan Anda. Anda harus menemukan tajuk Swift di sana.Saya punya masalah, bahwa Xcode mengubah nama saya
my-Project-Swift.h
menjadimy_Project-Swift.h
Xcode tidak suka"." "-"
simbol dll. Dengan metode di atas, Anda dapat menemukan nama file dan mengimpornya ke kelas Objective-C.sumber
#import "my_project-Swift.h"
dan nama proyek saya yang sebenarnya adalahmy-project
Cukup sertakan # impor "myProject-Swift.h" dalam file .m atau .h
PS Anda tidak akan menemukan "myProject-Swift.h" di inspektur file tersembunyi. Tapi itu dihasilkan oleh aplikasi secara otomatis.
sumber
@sig jawaban adalah salah satu yang terbaik, namun, itu tidak berhasil bagi saya dengan proyek lama (bukan baru!), saya perlu beberapa modifikasi. Setelah banyak variasi, saya menemukan resep untuk saya (menggunakan XCode 7.2):
Poin terakhir (5) sangat penting. Saya meletakkannya hanya di bagian kedua (bidang Target), bidang Proyek harus dibiarkan kosong: Jika tidak, itu tidak menghasilkan file "Project-Swift.h" yang tepat untuk saya (tidak termasuk metode cepat).
sumber
Define Modules
seharusnyaNo
??Ada dua syarat,
Jadi, untuk tujuan itu, Anda harus mengikuti langkah-langkah ini:
Pergi ke Pengaturan Bangun dan lakukan langkah-langkah di bawah ini dengan pencarian,
Setelah itu, bersihkan dan bangun kembali proyek Anda.
Gunakan file cepat Anda dalam file c objektif.
Dalam hal ini, Pertama tulis "@objc" sebelum kelas Anda di file cepat.
Setelah itu, Di file objektif Anda, tulis ini,
Gunakan file c tujuan Anda dalam file cepat.
Dalam hal itu, Di file header Anda, tulis ini,
Saya harap ini akan membantu Anda.
sumber
Untuk Swift 5:
@objc
kata kunci ke kelas dan metode Andapublic
kata kunci ke kelas dan metode AndaNSObject
Masukkan
#import "MyProject-Swift.h"
file Objective-C Andasumber
Dalam kasus saya, terlepas dari langkah-langkah ini:
Saya harus meletakkan kelas sebagai publik untuk membuat file productName-Swift.h :
sumber
Saya baru saja menemukan bahwa menambahkan direktori file cepat ke proyek tidak akan berfungsi. Anda harus membuat grup terlebih dahulu untuk direktori, lalu menambahkan file cepat ...
sumber
Saya memiliki masalah yang sama dan akhirnya tampaknya mereka tidak terikat pada target yang sama. Kelas ObjC terlampir pada Target1 dan Target2, kelas Swift hanya melekat pada Target1 dan tidak terlihat di dalam kelas ObjC.
Semoga ini bisa membantu seseorang.
sumber
masalah saya adalah saya macet setelah xcode membuat file bridge tapi masih ada error pada nama file header MYPROJECTNAME-swift.h
1.Saya check-in terminal dan mencari semua file jembatan swift otomatis:
find ~/library/Developer/Xcode/DerivedData/ -name "*-Swift.h"|xargs basename|sort -
Anda melihat apa yang dibuat xcode.
sumber
Ketika Anda menambahkan file Swift baru ke proyek, tolong pastikan Anda menambahkannya ke target yang benar. Harap pastikan bahwa setiap file cepat yang akan Anda gunakan mewarisi kelas NSObject dan dianotasi dengan @ObjCMembers. Ubah ke YES di dalam pengaturan build di bawah opsi ALWAYS_EMBED_SWIFT_STANDARD_LIBRARY. Ubah ke YA di dalam pengaturan build di bawah opsi DEFINES_MODULE.
sumber
Saya memiliki kesalahan yang sama:
myProjectModule-Swift.h
file tidak ditemukan ", tetapi, dalam kasus saya, alasan sebenarnya ada dalam target penyebaran yang salah:"Swift
tidak tersedia di OS X lebih awal dari 10.9; harap setelMACOSX_DEPLOYMENT_TARGET
ke 10.9 atau lebih baru (saat ini '10 .7 ') "jadi, ketika saya mengubah target penempatan menjadi 10.9 - proyek telah berhasil dikompilasi.sumber
Masalah saya adalah pembuatan file -swift.h secara otomatis tidak dapat memahami subkelas CustomDebugStringConvertible. Saya mengubah kelas menjadi subclass dari NSObject sebagai gantinya. Setelah itu, file -swift.h sekarang termasuk kelas dengan benar.
sumber
Saya mempunyai masalah karena saya akan menambahkan kelas ke header bridging objektif-c saya, dan pada header objektif-c yang diimpor, mereka mencoba mengimpor header cepat. Itu tidak seperti itu.
Jadi di semua kelas objektif-c saya yang menggunakan swift, tetapi juga dijembatani, kuncinya adalah untuk memastikan bahwa Anda menggunakan deklarasi kelas forward di header, lalu mengimpor file "* -Swift.h" dalam file .m.
sumber
Saya tidak perlu mengubah pengaturan apa pun di build atau menambahkan @obj ke kelas.
Yang harus saya lakukan adalah membuat jembatan-header yang secara otomatis dibuat ketika saya membuat kelas Swift ke proyek Objective-c. Dan kemudian aku harus melakukannya
impor "Bedtime-Swift.h" <- di dalam file objektif-c yang perlu menggunakan file swift itu.
sumber
yah, setelah membaca semua komentar dan mencoba dan membaca dan mencoba lagi, saya berhasil memasukkan kelas cepat ke dalam proyek Big obj-c saya. Jadi, terima kasih atas semua bantuannya. Saya ingin berbagi satu tip yang membantu saya memahami proses dengan lebih baik. Di kelas .m, pergi ke baris impor nama target cepat #import "myTargetName-Swift.h" dan mengklik tombol:
perintah + klik mouse -> Langsung ke definisi
Di sana Anda dapat melihat semua terjemahan dari swift ke obj-c dan di sana Anda akan menemukan berbagai fungsi yang dinyatakan kembali di obj-c. Semoga tip ini akan membantu Anda sebanyak itu membantu saya.
sumber
Menggunakan Kelas Swift di Objective-C
Jika Anda akan mengimpor kode dalam Target Aplikasi (Mencampur Objective-C dan Swift dalam satu proyek), Anda harus menggunakan baris impor berikutnya
#import "<#YourProjectName#>-Swift.h"
untuk mengekspos kode Swift ke kode Objective-C [Mencampur kode Swift dan Objective-C dalam suatu proyek]Dalam posting ini saya akan menjelaskan cara mengimpor perpustakaan statis Swift ke kode Objective-C
Konsumen Objective-C -> Swift static library
Xcode versi 10.2.1
Buat perpustakaan statis Swift
Ikuti
Create Swift static library
dengan penambahan selanjutnya:Paparkan API Swift. Untuk menggunakan fungsi Swift dari Objective-C [Tentang]
Setelah membangun, Anda harus menemukan
<product_name>-Swift.h
file yang seharusnya berada diDerivedSources
[File tidak ditemukan]Konsumen Objective-C dengan perpustakaan statis Swift
Drag and drop
biner ke proyek Xcode [Tentang]Link Library
[Simbol yang tidak terdefinisi] [Tautan vs. Sematan]Tambahkan
Library Search paths
[Perpustakaan tidak ditemukan untuk] [Jalur rekursif]Tambahkan
Header Search Paths
[Modul tidak ditemukan] [Jalur rekursif]Tambahkan kosong
.swift file
ke proyek Objective-C. [Simbol yang tidak terdefinisi] Ketika Xcode meminta tekan CreateBridging Header
(itu akan membuatmodule_name-Bridging-Header.h
) dan mengatur path ke file ini diImpor modul ke kode klien Objective-C [File tidak ditemukan] [module_name]
Lebih banyak contoh di sini
sumber
XCode 11.3.1:
Ketika saya ingin menggunakan kelas dalam Swift dalam kode objc, itu tidak mengkompilasi untuk kesalahan "simbol tidak terdefinisi" (untuk mengganggu kelas dalam dan luar kelas), saya memeriksa header "-swift.h" yang dihasilkan dan kedua kelas sana.Setelah mencoba selama berjam-jam saya mengubah kelas batin ke kelas normal dan dikompilasi.Saya membersihkan proyek, menghapus folder DerivedData dan mengkompilasinya.
sumber
@objc
sebelum deklarasi kelas batin?Setelah melakukan semua hal di atas, saya masih mendapat kesalahan. Masalah saya akhirnya adalah bahwa file Swift yang saya butuhkan tidak ditambahkan ke sumber daya bundel untuk beberapa alasan.
Saya memperbaikinya dengan pergi ke [Target Saya]> Bangun Fase> Salin Sumber Daya Bundel, lalu klik tombol tambah dan tambahkan file Swift.
sumber