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
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
Jawaban:
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 @objc
atau diwarisi dari NSObject
.
Pertimbangan:
Jika nama target Anda berisi spasi, gantilah dengan garis bawah (mis. My Project
Menjadi My_Project-Swift.h
)
Jika target Anda adalah kerangka kerja, Anda perlu mengimpor <TargetName/TargetName-Swift.h>
Pastikan file Swift Anda adalah anggota target
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.
NSObject
!!! Anda tidak bisa langsung menyatakan dengan class Blah
cepat dan membuatnya bekerja. harusclass Blah : NSObject
Inilah yang harus dilakukan:
Buat Proyek baru di Objective-C
Buat .swift
file
baru
Klik pada file Proyek Xcode Anda
Klik pada Pengaturan Bangun
Temukan bilah Pencarian dan cari Modul Tentukan .
Ubah nilainya menjadi Ya .
Cari Nama Modul Produk .
Ubah nilainya ke nama proyek Anda.
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"
Defines module
dalam Build settings
untuk Yes
apa tetap hal untuk saya!
YourProjectName
in #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.
Jika Anda menggunakan Cocoapods dan mencoba menggunakan Swift pod dalam proyek ObjC, Anda cukup melakukan hal berikut:
@import <FrameworkName>;
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.
Mengimpor Swift
file di dalam Objective-c
dapat menyebabkan kesalahan ini, jika tidak import
benar.
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 Name
di Targets -> Build Settings
.
Berdasarkan di atas, saya akan mengimpor KJExpandable-Swift.h
apa adanya.
Anda akan TargetName-Swift.h
, Dimana TargetName
berbeda 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
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 .
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"
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>
MyFramework
di 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 #import
ditambahkan, maka Anda telah memiliki setidaknya satu build yang berhasil dengan beberapa kode Swift di target), maka Anda masih harus melihat file MyFramework-Swift.h
di Headers
direktori.
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/
Periksa catatan pra-rilis tentang Swift dan Objective C dalam proyek yang sama
Anda harus mengimpor
#import "SCLAlertView-Swift.h"
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
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"
.
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:
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
Bangun dan Lari.
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.
#import <TargetName-Swift.h>
Anda akan melihat ketika Anda masuk dari keyboard #import <dan setelah secara otomatis Xcode akan memberi saran kepada Anda.
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