Bagaimana saya bisa mengimpor kode Swift ke Objective-C?


281

Saya telah menulis perpustakaan di Swift dan saya tidak dapat mengimpornya ke proyek saya saat ini, ditulis dalam Objective-C.

Apakah ada cara untuk mengimpornya?

#import "SCLAlertView.swift" - 'SCLAlertView.swift' file not found

9
suka proyek ini!
SleepsOnNewspapers

Jawaban:


430

Anda perlu mengimpor TargetName-Swift.h. Perhatikan bahwa itu adalah nama target - jawaban lain membuat kesalahan dengan menggunakan nama kelas.

File tunggal ini adalah header autogenerated yang mendefinisikan antarmuka Objective-C untuk semua kelas Swift dalam proyek Anda yang dianotasi dengan @objcatau diwarisi dari NSObject.

Pertimbangan:

  • Jika nama target Anda berisi spasi, gantilah dengan garis bawah (mis. My ProjectMenjadi My_Project-Swift.h)

  • Jika target Anda adalah kerangka kerja, Anda perlu mengimpor <TargetName/TargetName-Swift.h>

  • Pastikan file Swift Anda adalah anggota target


5
Perhatikan bahwa jika Anda mencoba menggunakan nama file Swift di impor Anda, Anda akan mendapatkan kesalahan "Diharapkan ';' setelah deklarator tingkat atas ". dalam file Swift Anda setelah "import Foundation".
louielouie

8
EDIT: Catatan: agar ini berfungsi, nama modul proyek HARUS ditentukan. Lihat: stackoverflow.com/a/24064015/2085743
Ruben Martinez Jr.

7
Saya hanya ingin menambahkan catatan bahwa jika nama proyek Anda memiliki spasi putih atau karakter khusus, Anda harus menggantinya dengan garis bawah, seperti "Aplikasi Saya" akan menjadi "My_App-Swift.h"
Hola Soy Edu Feliz Navidad

84
Mengapa ini sangat sulit dan tidak terdokumentasi dengan baik?
uchuugaka

3
@ Elelo Tidak, file itu kebalikan dari yang ini. Header penghubung ditulis oleh pengembang dan memungkinkan Anda membawa simbol Objective-C dan C ke dalam kode Swift Anda. File Target-Swift.h secara otomatis dihasilkan dan memungkinkan kode Objective-C / C Anda mengakses simbol Swift.
Bill

154

Instruksi dari situs web Apple:

Untuk mengimpor kode Swift ke Objective-C dari kerangka kerja yang sama

Di bawah Pengaturan Bangun , di Pengemasan , pastikan pengaturan Modul Menentukan untuk target kerangka kerja diatur ke Ya . Impor kode Swift dari target kerangka kerja tersebut ke file Objective-C .m di dalam target kerangka kerja menggunakan sintaks ini dan mengganti nama yang sesuai:

#import "ProductName-Swift.h"

Revisi:

Anda hanya dapat mengimpor "ProductName-Swift.h" dalam file .m.

File Swift di target Anda akan terlihat di file Objective-C .m yang berisi pernyataan impor ini.

Untuk menghindari referensi siklis, jangan impor Swift ke file header Objective-C. Sebagai gantinya, Anda bisa meneruskan mendeklarasikan kelas Swift untuk menggunakannya dalam header Objective-C. Perhatikan bahwa Anda tidak dapat mensubkelas kelas Swift di Objective-C.

masukkan deskripsi gambar di sini


2
Hanya mengimpor "ProductName-Swift.h" dalam file .m yang membantu saya. Menambahkan yang sama dalam file .pch memberi "Tidak dapat menemukan deklarasi protokol untuk 'CLLocationManagerDelegate'; apakah maksud Anda 'NSLayoutManagerDelegate'?"
Alphonse R. Dsouza

@ AJIT tidak langsung, dokumentasi mengatakan itu. Cara termudah adalah dengan membuat kelas Objective-C yang diterjemahkan dalam format yang dimengerti oleh Objective-C ++. developer.apple.com/library/ios/documentation/Swift/Conceptual/…
Alejandro Iván

1
Perhatikan bahwa Anda harus berasal dari NSObject!!! Anda tidak bisa langsung menyatakan dengan class Blah cepat dan membuatnya bekerja. harusclass Blah : NSObject
David T.

Layak membaca jawaban ini untuk beberapa kasus: stackoverflow.com/questions/26328034/... Bergantung pada apa yang Anda lakukan: #import <ProductName / ProductModuleName-Swift.h> #import <ProductModuleName-Swift.h> #import <NewTestApp / NewTestApp -Swift.h>
inigo333

Bagaimana jika Anda ingin mengimpor ekstensi Swift?
Ricardo

150

Inilah yang harus dilakukan:

  1. Buat Proyek baru di Objective-C

  2. Buat .swiftfile   baru

    • Jendela sembulan akan muncul dan bertanya "Apakah Anda ingin mengonfigurasi Header penghubung Objective-C" .
    • Pilih Ya .
  3. Klik pada file Proyek Xcode Anda

  4. Klik pada Pengaturan Bangun

  5. Temukan bilah Pencarian dan cari Modul Tentukan .

  6. Ubah nilainya menjadi Ya .

  7. Cari Nama Modul Produk .

  8. Ubah nilainya ke nama proyek Anda.

  9. Dalam delegasi Aplikasi, tambahkan berikut ini: #import "YourProjectName-Swift.h"


Catatan: Setiap kali Anda ingin menggunakan file Swift Anda, Anda harus mengimpor baris berikut:

#import "YourProjectName-Swift.h"


1
Mengubah nilai dari Defines moduledalam Build settingsuntuk Yesapa tetap hal untuk saya!
Zakaria Braksa

Konten Tertanam Berisi Swift: YA GUNAKAN ini juga
Mohit

4
jawaban yang baik tetapi langkah 7-8 tidak diperlukan dalam Xcode 7.3.1 dan lebih tinggi
Sam B

Bekerja untukku! Terima kasih.
itsdamslife

1
Hanya ingin menambahkan bahwa YourProjectNamein #import "YourProjectName-Swift.h"akan menjadi nama proyek dari langkah 8. Berguna jika nama proyek Anda mengandung karakter khusus dan Anda tidak yakin bagaimana tepatnya Anda harus memformatnya.
Chuck Boris

40

Jika Anda menggunakan Cocoapods dan mencoba menggunakan Swift pod dalam proyek ObjC, Anda cukup melakukan hal berikut:

@import <FrameworkName>;

masukkan deskripsi gambar di sini


1
Terima kasih banyak! kamu menyelamatkan hariku.
Esha

Ini berfungsi seperti pesona jika kita menginstal pustaka cepat melalui Cocoapods. Terpilih !!!
NSPratik

21

Pergi ke membangun pengaturan dalam file proyek Anda dan cari "Objecter-C Generated Header Name . Nilai properti itu adalah nama yang harus Anda sertakan.

Jika properti "Nama Modul Produk" Anda (properti yang bergantung pada properti di atas secara default) bervariasi tergantung pada apakah Anda mengkompilasi untuk pengujian / debug / rilis / dll (seperti halnya dalam kasus saya), maka buat properti ini independen dari itu variasi dengan menetapkan nama khusus.


15

Mengimpor Swiftfile di dalam Objective-cdapat menyebabkan kesalahan ini, jika tidak importbenar.

CATATAN: Anda tidak perlu mengimpor file Swift secara eksternal, Anda hanya perlu mengimpor satu file yang menangani file swift.

Ketika Anda Membuat / Menyalin file Swift di dalam proyek Objective-C . Itu akan membuat header penghubung secara otomatis.

Periksa Objective-C Generated Interface Header Namedi Targets -> Build Settings.

masukkan deskripsi gambar di sini

Berdasarkan di atas, saya akan mengimpor KJExpandable-Swift.hapa adanya.

Anda akan TargetName-Swift.h, Dimana TargetNameberbeda berdasarkan nama proyek Anda atau target lain yang mungkin Anda tambahkan dan jalankan di atasnya.

Seperti di bawah target saya KJExpandable, jadi ituKJExpandable-Swift.h
masukkan deskripsi gambar di sini


12

Langkah pertama:-

Pilih Target Proyek -> Pengaturan Bangun -> Pencarian ('Tentukan') -> Tentukan nilai pembaruan Modul Tidak ke Ya

"Defines Module": YES .

"Selalu Embed Swift Standard Library": YES .

"Instal Header Kompatibilitas Objective-C": YES .

masukkan deskripsi gambar di sini

Tahap kedua:-

Tambahkan Swift file Class di Objective C ".h" File seperti di bawah ini

#import <UIKit/UIKit.h>

@class TestViewController(Swift File);

@interface TestViewController(Objective C File) : UIViewController

@end

Impor 'ProjectName (Nama Proyek Anda) -Swift.h' dalam file Objective C ".m"

//TestViewController.m 
#import "TestViewController.h"

/*import ProjectName-Swift.h file to access Swift file here*/

#import "ProjectName-Swift.h"

Deklarasi forward (@class) kelas adalah poin yang sangat bagus! Terima kasih!
Philipp Otto

10

Ada satu peringatan jika Anda mengimpor kode Swift ke file Objective-C Anda dalam kerangka kerja yang sama . Anda harus melakukannya dengan menentukan nama kerangka dan kurung sudut:

#import <MyFramework/MyFramework-Swift.h>

MyFrameworkdi sini adalah pengaturan build "Nama Modul Produk" ( PRODUCT_NAME = MyFramework).

Menambahkan saja #import "MyFramework-Swift.h"tidak akan berhasil. Jika Anda memeriksa direktori produk bawaan (sebelum #importditambahkan, maka Anda telah memiliki setidaknya satu build yang berhasil dengan beberapa kode Swift di target), maka Anda masih harus melihat file MyFramework-Swift.hdi Headersdirektori.


8

Jika Anda memiliki proyek yang dibuat di Swift 4 dan kemudian menambahkan file Objective-C, lakukan seperti ini:

@objcMembers
public class MyModel: NSObject {
    var someFlag = false         
    func doSomething() {         
        print("doing something")
    }
}

Referensi: https://useyourloaf.com/blog/objc-warnings-upgrading-to-swift-4/


Dalam kode saya, setelah saya memperbaruinya ke Swift 4.2 dari swift 3. Tidak berfungsi
SNarula

kesalahan apa yang kamu dapatkan? Saya telah menggunakan kode di atas dalam Swift4.2 dan berfungsi dengan baik.
Prashant Bhayani

Ok itu bagus.
Prashant Bhayani

4

Periksa catatan pra-rilis tentang Swift dan Objective C dalam proyek yang sama

https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-XID_75

Anda harus mengimpor

#import "SCLAlertView-Swift.h"

3
Tunjukkan saya kesalahan ini: File 'SCLAlertView-Swift.h' tidak ditemukan.
Viktor Radchenko

2
Perlu nama proyek, bukan nama file - lihat jawaban saya.
Bill

1
Terima kasih atas tautan dokumentasi. Itu berguna untuk referensi.
louielouie

2
Mengutip dari tautan yang disediakan: The name of this header is your product module name followed by adding "-Swift.h".Jadi itu bukan nama kelas seperti yang Anda tulis, tetapi nama modul produk Anda dan yang menangani mengimpor semua file cepat, bukan hanya yang spesifik
Chris

4

Cari "Nama Header Antarmuka Antarmuka Objective-C" di Pengaturan Bangun dari target yang Anda coba buat (katakan saja itu MyApp-Swift.h), dan impor nilai pengaturan ini ( #import "MyApp-Swift.h") di file sumber tempat Anda mencoba mengakses API Swift Anda.

Nilai default untuk bidang ini adalah $(SWIFT_MODULE_NAME)-Swift.h. Anda dapat melihatnya jika Anda mengklik dua kali pada bidang nilai pengaturan "Nama Header Antarmuka Antarmuka Objective-C Generated".

Juga, jika Anda memiliki tanda hubung pada nama modul Anda (katakanlah itu My-App), maka di $(SWIFT_MODULE_NAME)semua tanda hubung akan diganti dengan garis bawah. Maka Anda harus menambahkan #import "My_App-Swift.h".


Lebih baik dari yang disetujui. Tanda hubung terbuang 20 menit saya tidak akan pernah kembali haha.
Roi Mulia

3

Jika Anda ingin menggunakan file Swift ke kelas Objective-C , jadi mulai Xcode 8 dan seterusnya, Anda dapat mengikuti langkah-langkah di bawah ini:

Jika Anda telah membuat proyek di Objective-C:

  1. Buat file Swift baru
  2. Xcode akan secara otomatis meminta file Bridge-Header
  3. Hasilkan itu
  4. Impor "ProjectName-Swift.h" di pengontrol Objective-C Anda (impor dalam implementasi bukan di antarmuka) (jika proyek Anda memiliki ruang di antara nama, jadi gunakan garis bawah "Project_Name-Swift.h")
  5. Anda akan dapat mengakses kelas Objective-C Anda di Swift.

Kompilasi dan jika itu akan menghasilkan kesalahan linker seperti: dikompilasi dengan versi bahasa Swift (3.0) yang lebih baru dari file sebelumnya (2.0) untuk arsitektur x86_64 atau armv 7

Buat satu perubahan lagi di blog Anda

  1. Xcode -> Project -> Target -> Build Settings -> Gunakan Legacy Swift Language Version -> Ya

Bangun dan Lari.


1
saya tidak mendapatkan opsi ini untuk menggunakan versi bahasa cepat lawas
rd_

1

Hati-hati dengan tanda hubung dan garis bawah, mereka dapat digabungkan dan Nama Proyek dan nama Target Anda tidak akan sama dengan SWIFT_MODULE_NAME.

Tanda hubung dan garis bawah


1
#import <TargetName-Swift.h>

Anda akan melihat ketika Anda masuk dari keyboard #import <dan setelah secara otomatis Xcode akan memberi saran kepada Anda.


-1

Temukan file .PCH di dalam proyek. dan kemudian tambahkan #import "YourProjectName-Swift.h"ini akan mengimpor header kelas. Sehingga Anda tidak perlu mengimpor ke file tertentu.

#ifndef __IPHONE_3_0
#warning "This project uses features only available in iPhone SDK 3.0 and later."
#endif


#ifdef __OBJC__
    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
    #import "YourProjectName-Swift.h"
#endif
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.