Di Swift, bagaimana seseorang memanggil kode Objective-C?
Apple menyebutkan bahwa mereka dapat hidup berdampingan dalam satu aplikasi, tetapi apakah ini berarti bahwa seseorang secara teknis dapat menggunakan kembali kelas lama yang dibuat di Objective-C sambil membangun kelas baru di Swift?
objective-c
swift
David Mulder
sumber
sumber
Jawaban:
Menggunakan Kelas Objective-C di Swift
Langkah 1: Tambahkan Implementasi Objective-C - .m
Tambahkan
.m
file ke kelas Anda, dan beri namaCustomObject.m
.Langkah 2: Tambahkan Bridging Header
Saat menambahkan
.m
file Anda, Anda akan dipukul dengan prompt yang terlihat seperti ini:Klik Ya !
Jika Anda tidak melihat prompt, atau secara tidak sengaja menghapus header bridging Anda, tambahkan
.h
file baru ke proyek Anda dan beri nama<#YourProjectName#>-Bridging-Header.h
.Dalam beberapa situasi, terutama ketika bekerja dengan kerangka kerja Objective-C, Anda tidak menambahkan kelas Objective-C secara eksplisit dan Xcode tidak dapat menemukan tautan. Dalam hal ini, buat
.h
file Anda dengan nama yang disebutkan di atas, lalu pastikan Anda menautkan lintasannya di pengaturan proyek target Anda seperti:catatan:
Praktik terbaik untuk menautkan proyek Anda menggunakan
$(SRCROOT)
makro sehingga jika Anda memindahkan proyek Anda, atau mengerjakannya dengan orang lain menggunakan repositori jarak jauh, itu akan tetap berfungsi.$(SRCROOT)
dapat dianggap sebagai direktori yang berisi file .xcodeproj Anda. Mungkin terlihat seperti ini:Langkah 3: Tambahkan Header Objective-C - .h
Tambahkan
.h
file lain dan beri namaCustomObject.h
.Langkah 4: Bangun Kelas Objective-C Anda
Di
CustomObject.h
Di
CustomObject.m
Langkah 5: Tambahkan Kelas ke Bridging-Header
Dalam
YourProject-Bridging-Header.h
:Langkah 6: Gunakan Objek Anda
Dalam
SomeSwiftFile.swift
:Tidak perlu mengimpor secara eksplisit; itulah gunanya header penghubung.
Menggunakan Kelas Swift di Objective-C
Langkah 1: Buat Kelas Swift Baru
Tambahkan
.swift
file ke proyek Anda, dan beri namaMySwiftObject.swift
.Dalam
MySwiftObject.swift
:Langkah 2: Impor File Swift ke ObjC Class
Dalam
SomeRandomClass.m
:File:
<#YourProjectName#>-Swift.h
seharusnya sudah dibuat secara otomatis di proyek Anda, bahkan jika Anda tidak dapat melihatnya.Langkah 3: Gunakan kelas Anda
Catatan:
Jika Penyelesaian Kode tidak berlaku seperti yang Anda harapkan, coba jalankan build cepat dengan ⌘⇧Runtuk membantu Xcode menemukan beberapa kode Objective-C dari konteks Swift dan sebaliknya.
Jika Anda menambahkan
.swift
file ke proyek yang lebih lama dan mendapatkan kesalahandyld: Library not loaded: @rpath/libswift_stdlib_core.dylib
, coba restart Xcode sepenuhnya .Meskipun pada awalnya dimungkinkan untuk menggunakan kelas Swift murni (Bukan turunan
NSObject
) yang terlihat oleh Objective-C dengan menggunakan@objc
awalan, ini tidak lagi mungkin. Sekarang, agar terlihat di Objective-C, objek Swift harus berupa kelas yang sesuaiNSObjectProtocol
(cara termudah untuk melakukan ini adalah mewarisi dariNSObject
), atauenum
ditandai@objc
dengan nilai mentah dari beberapa tipe integer sepertiInt
. Anda dapat melihat histori edit untuk contoh kode Swift 1.x menggunakan@objc
tanpa batasan ini.sumber
Lihat panduan Apple untuk Menggunakan Swift dengan Kakao dan Objective-C . Panduan ini mencakup cara menggunakan kode Objective-C dan C dari Swift dan sebaliknya dan memiliki rekomendasi untuk cara mengkonversi proyek atau mencampur dan mencocokkan Objective-C / C dan bagian Swift dalam proyek yang ada.
Compiler secara otomatis menghasilkan sintaks Swift untuk memanggil fungsi C dan metode Objective-C. Seperti yang terlihat dalam dokumentasi, Objective-C ini:
berubah menjadi kode Swift ini:
Xcode juga melakukan terjemahan ini dengan cepat - Anda dapat menggunakan Open Quickly saat mengedit file Swift dan ketik nama kelas Objective-C, dan itu akan membawa Anda ke versi header kelas Swift-ified dari header kelas. (Anda juga bisa mendapatkan ini dengan mengklik cmd pada simbol API di file Swift.) Dan semua dokumentasi referensi API di iOS 8 dan OS X v10.10 (Yosemite) perpustakaan pengembang terlihat di Objective-C dan Swift formulir (misalnya
UIView
).sumber
Berikut adalah petunjuk langkah demi langkah untuk menggunakan kode Objective-C (dalam hal ini, kerangka kerja yang disediakan oleh pihak ketiga) dalam proyek Swift:
Dalam langkah-langkah sederhana:
Sebuah prompt muncul, dan kemudian klik OK ... Jika tidak muncul, maka kami membuatnya secara manual seperti berikut ini ... Buat satu file header dari sumber iOS dan beri nama ProjectName-Bridging-Header (contoh: Tes -Bridging-Header), dan kemudian pergi untuk membangun pengaturan dalam kode kompiler Swift -> Objective-C bridge menambahkan nama jembatan Objective-C .. (Test / Test-Bridging-Header.h). Ya, itu lengkap.
Secara opsional, hapus file Objective-C yang Anda tambahkan (beri nama "apa pun" pada gambar GIF di atas). Anda tidak membutuhkannya lagi.
Buka file header bridging - nama file dalam bentuk [Proyek Anda] -Bridging-Header.h . Ini termasuk komentar yang disediakan Xcode. Tambahkan satu baris kode untuk file Objective-C yang ingin Anda sertakan , seperti kerangka kerja pihak ketiga. Misalnya, untuk menambahkan Mixpanel ke proyek Anda, Anda harus menambahkan baris kode berikut ke file header bridging:
Sekarang dalam file Swift apa saja Anda dapat menggunakan kode Objective-C yang ada, dalam sintaks Swift (dalam kasus contoh ini, dan Anda dapat memanggil metode Mixpanel SDK, dll.). Anda perlu membiasakan diri dengan bagaimana Xcode menerjemahkan Objective-C ke Swift. Panduan Apple adalah bacaan cepat. Atau lihat jawaban ini untuk ringkasan yang tidak lengkap.
Contoh untuk Mixpanel:
Itu dia!
Catatan: Jika Anda menghapus file header bridging dari proyek Anda , pastikan untuk masuk ke Pengaturan Bangun dan menghapus nilai untuk " Header Bridging Objective-C " di bawah "Swift Compiler - Pembuatan Kode".
sumber
Anda dapat membaca pos yang bagus Swift & Cocoapods . Pada dasarnya, kita perlu membuat file header bridging dan meletakkan semua header Objective-C di sana. Dan kemudian kita perlu referensi dari pengaturan build kita. Setelah itu, kita bisa menggunakan kode Objective-C.
Lihat juga dokumen Apple Menggunakan Swift dengan Kakao dan Objective-C juga.
sumber
Saya menulis proyek Xcode 6 sederhana yang menunjukkan cara mencampur kode C ++, Objective-C dan Swift:
https://github.com/romitagl/share/tree/master/C-ObjC-Swift/Performance_Console
Secara khusus, contoh memanggil fungsi Objective-C dan C ++ dari Swift .
Kuncinya adalah membuat header bersama, Project-Bridging-Header.h, dan meletakkan header Objective-C di sana.
Silakan unduh proyek sebagai contoh lengkap.
sumber
Satu hal lagi yang ingin saya tambahkan di sini:
Saya sangat berterima kasih atas jawaban @ Logan. Ini sangat membantu untuk membuat file jembatan dan pengaturan.
Tetapi setelah melakukan semua langkah ini saya masih belum mendapatkan kelas Objective-C di Swift.
Saya menggunakan
cocoapods
perpustakaan dan mengintegrasikannya ke dalam proyek saya. Yang manapod "pop"
.Jadi jika Anda menggunakan pod Objective-C di Swift maka mungkin ada kemungkinan Anda tidak bisa mendapatkan atau
import
kelas menjadi Swift.Hal sederhana yang harus Anda lakukan adalah:
<YOUR-PROJECT>-Bridging-Header
file dan#import <ObjC_Framework>
ke@import ObjC_Framework
Misalnya: (Pustaka pop)
Menggantikan
dengan
Gunakan
clang import
saat#import
tidak bekerja.sumber
Kutipan dari dokumentasi :
sumber
Hanya catatan untuk siapa pun yang mencoba menambahkan pustaka Objective-C ke Swift: Anda harus menambahkan -ObjC di Pengaturan Bangun -> Menautkan -> Bendera Tautan Lainnya .
sumber
Setelah Anda membuat header Bridging, pergi ke Build Setting => Cari "Header Bridging Objective-C".
Tepat di bawah Anda akan menemukan file "" Objective-C Generated Interface Header Name ".
Impor file itu di controller tampilan Anda.
Contoh: Dalam kasus saya: "Dauble-Swift.h"
sumber
Klik pada menu File baru , dan pilih bahasa pilih file Objective. Pada saat itu secara otomatis menghasilkan file "Objective-C Bridging Header" yang digunakan untuk mendefinisikan beberapa nama kelas.
"Objective-C Bridging Header" di bawah "Swift Compiler - Code Generation".
sumber
sumber
Saya telah menambahkan proyek pada github yang menyertakan sampel kecil untuk memanggil kode c objektif dari swift.
Panggil kelas ObjectiveC dari swift
sumber
Dalam proyek Swift 4.2.1 di Xcode 10.1 Anda dapat dengan mudah menambahkan file Objective-C. Ikuti langkah-langkah di bawah ini untuk menjembatani file Objective-C ke proyek Swift.
Step_01: Buat proyek Xcode baru menggunakan bahasa Swift:
File
>New
>Project
>objc
.Step_02: Dalam proyek Swift tambahkan file Objective-C baru:
File
>New
>File...
>macOS
>Objective-C File
.Step_03: Jika Anda menambahkan file Objective-C baru ke proyek Swift pada saat pertama kali, Xcode meminta Anda:
Would you like to configure an Objective-C bridging header
?Step_04: Pilih opsi:
Create Bridging Header
.Step_05: File yang sesuai akan dihasilkan dengan nama:
Objc-Bridging-Header.h
.Step_06: Sekarang, Anda perlu mengatur path file Bridge di header bridge. Di Project Navigator klik pada proyek dengan nama
objc
dan kemudian pilih:Build Settings
>Objective-C Bridging Header
>Objc-Bridging-Header.h
.Step_07: Seret-dan-lepas Anda
Objc-Bridging-Header.h
ke dalam kotak itu untuk menghasilkan jalur file.Step_08: Buka
Objc-Bridging-Header.h
file Anda dan impor file Objective-C yang ingin Anda gunakan dalam file Swift Anda.Berikut isi dari
SpecialObjcFile.m
:Step_09: Sekarang di file Swift Anda, Anda bisa menggunakan kelas Objective-C:
sumber
Logans answer berfungsi dengan baik kecuali yang terbaru
Swift 5
memberikan beberapa kesalahan kompiler. Ini adalah perbaikan untuk orang-orang yang bekerja pada Swift 5.Cepat 5
sumber
Konsumen cepat, produsen Objective-C
Tambahkan header
.h
dan.m
file Implementasi - File kelas Kakao (Objective-C)Misalnya
MyFileName
mengkonfigurasi bridging header
Ketika Anda melihat
Would you like to configure an Objective-C bridging header
klik - Ya<target_name>-Bridging-Header.h
akan dihasilkan secara otomatisTambahkan Kelas ke Bridging-Header
Di
<target_name>-Bridging-Header.h
tambahkan baris#import "<MyFileName>.h"
PS Jika Anda harus menambahkan file Objective-C yang ada ke dalam proyek Swift, tambahkan
Bridging-Header.h
terlebih dahuluKonsumen Objective-C, produsen Swift
Tambahkan
<MyFileName>.swift
dan perpanjangNSObject
Impor File Swift ke ObjC Class
Tambahkan
#import "<#YourProjectName#>-Swift.h"
ke file Objective-C AndaTandai kode Swift publik [@objc dan @objcMembers]
sumber
Apple telah memberikan panduan resmi dalam dokumen ini: how-to-call-objective-c-code-from swift
Inilah bagian yang relevan:
Untuk mengimpor satu set file Objective-C ke dalam kode Swift dalam target aplikasi yang sama, Anda mengandalkan file header bridging Objective-C untuk mengekspos file tersebut ke Swift . Xcode menawarkan untuk membuat header ini ketika Anda menambahkan file Swift ke aplikasi Objective-C yang ada, atau file Objective-C ke aplikasi Swift yang ada.
Jika Anda menerima, Xcode membuat file header bridging bersama dengan file yang Anda buat, dan menamainya dengan menggunakan nama modul produk Anda diikuti oleh "-Bridging-Header.h". Atau, Anda dapat membuat header penghubung sendiri dengan memilih File> New> File> [sistem operasi]> Sumber> File Header
Edit header penghubung untuk mengekspos kode Objective-C Anda ke kode Swift Anda:
Setiap header Objective-C publik yang tercantum dalam header bridging terlihat oleh Swift.
sumber
Pendekatan dua arah untuk menggunakan objektif-c objektif-c
1
2
Sekarang baik untuk pergi. Terima kasih
sumber