Pertanyaan Cara memanggil kode Objective-C dari Swift


Dalam bahasa Swift baru dari Apple, 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-kelas lama yang dibuat di Objective-C sambil membangun kelas baru di Swift?

Penalaran

Objective-C adalah bahasa platform-independen, sedangkan Swift adalah platform-dependent. Menulis kode non-platform-dependent (pustaka logika bisnis) di Swift tidak akan bijaksana. Namun, menulis kode platform-dependent di dalamnya (antarmuka yang terkait misalnya) akan baik-baik saja. Bukan untuk mengatakan itu akan menjadi ide yang baik, namun ini jelas merupakan suatu minat.


818
2018-06-02 20:05


asal


Jawaban:


 Menggunakan Kelas Objective-C di Swift

** Jika Anda memiliki kelas yang ada yang ingin Anda gunakan, lakukan Langkah 2 dan kemudian lewati Langkah 5. (Untuk beberapa kasus, saya harus menambahkan eksplisit #import <Foundation/Foundation.h ke File Objective-C yang lebih tua.) **

 Langkah 1: Tambahkan Objective-C Implementasi - .m

Tambah sebuah .m file ke kelas Anda, dan beri nama CustomObject.m.

 Langkah 2: Tambahkan Bridging Header

Saat menambahkan Anda .m file, Anda mungkin akan dipukul dengan prompt yang terlihat seperti ini:

Enter image description here

Klik  IYA NIH !

Jika Anda tidak melihat prompt, atau tidak sengaja menghapus header bridging Anda, tambahkan yang baru .h file ke proyek Anda dan beri nama <#YourProjectName#>-Bridging-Header.h.

Dalam beberapa situasi, terutama ketika bekerja dengan framework Objective-C, Anda tidak menambahkan kelas Objective-C secara eksplisit dan Xcode tidak dapat menemukan linker. Dalam hal ini, buat Anda .h file bernama seperti yang disebutkan di atas, kemudian pastikan Anda menautkan jalurnya dalam pengaturan proyek target Anda seperti:

Enter image description here

Catatan

Ini praktik terbaik untuk menghubungkan 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:

$(SRCROOT)/Folder/Folder/<#YourProjectName#>-Bridging-Header.h

 Langkah 3: Tambahkan Objective-C Header - .h

Tambahkan yang lain .h file dan beri nama CustomObject.h.

 Langkah 4: Buat Objective-C Class Anda

Di CustomObject.h

#import <Foundation/Foundation.h>

@interface CustomObject : NSObject

@property (strong, nonatomic) id someProperty;

- (void) someMethod;

@end

Di CustomObject.m

#import "CustomObject.h"

@implementation CustomObject 

- (void) someMethod {
    NSLog(@"SomeMethod Ran");
}

@end

 Langkah 5: Tambahkan Kelas ke Bridging-Header

Di YourProject-Bridging-Header.h:

#import "CustomObject.h"

 Langkah 6: Gunakan Objek Anda

Di SomeSwiftFile.swift:

var instanceOfCustomObject: CustomObject = CustomObject()
instanceOfCustomObject.someProperty = "Hello World"
println(instanceOfCustomObject.someProperty)
instanceOfCustomObject.someMethod()

Tidak perlu mengimpor secara eksplisit; itulah tujuan dari menjembatani.

 Menggunakan Kelas Swift dalam Objective-C

 Langkah 1: Buat Kelas Swift Baru

Tambah sebuah .swift file ke proyek Anda, dan beri nama MySwiftObject.swift.

Di MySwiftObject.swift:

import Foundation

class MySwiftObject : NSObject {

    var someProperty: AnyObject = "Some Initializer Val"

    init() {}

    func someFunction(someArg:AnyObject) -> String {
        var returnVal = "You sent me \(someArg)"
        return returnVal
    }   
}

 Langkah 2: Impor File Swift ke ObjC Class

Di SomeRandomClass.m:

#import "<#YourProjectName#>-Swift.h"

Berkas:<#YourProjectName#>-Swift.h seharusnya sudah dibuat secara otomatis di proyek Anda, bahkan jika Anda tidak dapat melihatnya.

 Langkah 3: Gunakan kelas Anda

MySwiftObject * myOb = [MySwiftObject new];
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
myOb.someProperty = @"Hello World";
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
NSString * retString = [myOb someFunction:@"Arg"];
NSLog(@"RetString: %@", retString);

catatan:

1 CodeCompletion tidak berperilaku seakurat yang saya inginkan. Di sistem saya, menjalankan quick build dengan "cmd + r" sepertinya membantu Swift menemukan beberapa kode Objective-C dan sebaliknya.

2 Jika Anda menambahkan .swift file ke proyek lama dan mendapatkan kesalahan: dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib, coba sepenuhnya memulai ulang Xcode.

3 Meskipun awalnya mungkin untuk menggunakan kelas Swift murni di Objective-C dengan menggunakan @objc awalan, setelah Swift 2.0, ini tidak mungkin lagi. Lihat mengedit sejarah untuk penjelasan asli. Jika fungsi ini diaktifkan kembali dalam versi Swift di masa mendatang, jawabannya akan diperbarui dengan tepat.


1212
2018-06-03 00:12



Lihat panduan Apple untuk Menggunakan Swift dengan Cocoa dan Objective-C. Panduan ini mencakup cara menggunakan kode Objective-C dan C dari Swift dan sebaliknya dan memiliki rekomendasi untuk cara mengonversi proyek atau mencampur dan mencocokkan bagian Objective-C / C dan Swift dalam proyek yang ada.

Kompilator secara otomatis menghasilkan sintaks Swift untuk memanggil fungsi C dan metode Objective-C. Seperti yang terlihat dalam dokumentasi, Objective-C ini:

UITableView *myTableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];

berubah menjadi kode Swift ini:

let myTableView: UITableView = UITableView(frame: CGRectZero, style: .Grouped)

Xcode juga melakukan terjemahan ini dengan cepat - Anda dapat menggunakan Buka Cepat saat mengedit file Swift dan ketik nama kelas Objective-C, dan itu akan membawa Anda ke versi Swift-ified dari header kelas. (Anda juga bisa mendapatkan ini dengan cmd-klik pada simbol API dalam file Swift.) Dan semua dokumentasi referensi API di iOS 8 dan OS X v10.10 (Yosemite) pustaka pengembang terlihat dalam bentuk Objective-C dan Swift (mis. UIView).


101
2018-06-02 20:43



Berikut adalah petunjuk langkah demi langkah untuk menggunakan kode Objective-C (dalam hal ini, kerangka kerja yang disediakan oleh pihak ketiga) dalam proyek Swift:

  1. Tambahkan file Objective-C ke proyek Swift Anda dengan memilih File -> New -> File Baru -> Objective-C File. Setelah menyimpan, Xcode akan menanyakan apakah Anda ingin menambahkan header bridging. Pilih 'iya nih'. Gif: menambahkan file kosong untuk memproyeksikan dan menghasilkan header bridging http://www.derrrick.com/stackoverflow/1-empty-file.gif

Dalam langkah sederhana:

  1. Sebuah prompt muncul, dan kemudian klik OK ... Jika tidak muncul, maka kita buat secara manual seperti berikut ini ... Buat satu file header dari sumber iOS dan beri nama ProjectName-Bridging-Header (contoh: Test -Bridging-Header), dan kemudian pergi untuk membangun pengaturan dalam kode kompilator Swift -> Objective-C bridge menambahkan nama jembatan Objective-C .. (Test / Test-Bridging-Header.h). Ya, itu lengkap.

  2. Opsional, hapus file Objective-C yang Anda tambahkan (bernama "apa saja" di gambar GIF di atas). Anda tidak membutuhkannya lagi.

  3. Buka file header bridging - nama file adalah bentuk [YourProject] -Bridging-Header.h. Ini termasuk komentar yang disediakan Xcode. Tambahkan baris kode untuk file Objective-C yang ingin Anda sertakan, seperti kerangka pihak ketiga. Misalnya, untuk menambahkan Mixpanel ke proyek Anda, Anda perlu menambahkan baris kode berikut ke file header bridging:

    #import "Mixpanel.h"
  4. Sekarang dalam file Swift apa pun Anda bisa gunakan 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 cara Xcode menerjemahkan Objective-C ke Swift. Panduan Apple adalah membaca cepat. Atau lihat jawaban ini untuk ringkasan yang tidak lengkap.

Contoh untuk Mixpanel:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    Mixpanel.sharedInstanceWithToken("your-token")
    return true
}

Itu dia!

catatan: Jika Anda menghapus file header bridging dari proyek Anda, pastikan untuk masuk ke Pengaturan Build dan hapus nilai untuk "Objektif-C Menjembatani Header"di bawah" Swift Compiler - Code Generation ".


49
2018-02-12 19:34



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 kami. Setelah itu, kita bisa menggunakan kode Objective-C.

let manager = AFHTTPRequestOperationManager()
manager.GET(
  "http://example.com/resources.json",
  parameters: nil,
  success: { (operation: AFHTTPRequestOperation!,
              responseObject: AnyObject!) in
      println("JSON: " + responseObject.description)
  },
  failure: { (operation: AFHTTPRequestOperation!,
              error: NSError!) in
      println("Error: " + error.localizedDescription)
  })

Lihat juga dokumen Apple Menggunakan Swift dengan Cocoa dan Objective-C demikian juga.


30
2018-06-04 02:11



Saya menulis proyek Xcode 6 sederhana yang menunjukkan cara mencampur kode C ++, Objective-C dan Swift:

https://github.com/romitagl/shared/tree/master/C-ObjC-Swift/Performance_Console

Khususnya, contohnya memanggil Objective-C dan fungsi C ++ dari Swift.

Kuncinya adalah membuat header bersama, Project-Bridging-Header.h, dan meletakkan header Objective-C di sana.

Silakan unduh proyek ini sebagai contoh lengkap.


19
2018-06-13 10:10



Kutipan dari dokumentasi:

Kerangka Objektif-C (atau pustaka C) yang dapat diakses sebagai modul   dapat diimpor langsung ke Swift. Ini termasuk semua   Kerangka kerja sistem Objective-C — seperti Foundation, UIKit, dan   SpriteKit — serta pustaka C umum yang disertakan dengan sistem. Untuk   Misalnya, untuk mengimpor Foundation, cukup tambahkan pernyataan impor ini ke   bagian atas file Swift yang Anda kerjakan:

import Foundation

Impor ini membuat semua API Yayasan — termasuk NSDate, NSURL,   NSMutableData, dan semua metode, properti, dan   kategori — tersedia langsung di Swift.


17
2018-06-02 20:43



Satu hal lagi yang ingin saya tambahkan di sini:

Saya sangat berterima kasih kepada jawaban @ Logan. Ini membantu banyak untuk membuat file bridge dan setup.

Tetapi setelah melakukan semua langkah ini saya masih belum mendapatkan kelas Objective-C di Swift.

Saya menggunakan cocoapods perpustakaan dan terintegrasi dalam proyek saya. Yang mana pod "pop".

Jadi jika menggunakan pod Objective-C di Swift maka mungkin ada kemungkinan Anda tidak bisa mendapatkan atau import kelas-kelas ke Swift.

Hal sederhana yang harus Anda lakukan adalah:

  1. Pergi ke <YOUR-PROJECT>-Bridging-Header file dan
  2. Ganti pernyataannya #import <ObjC_Framework> untuk @import ObjC_Framework

Sebagai contoh: (Pop library)

Menggantikan

#import <pop/POP.h>

dengan

@import pop;

Menggunakan clang import kapan #import tidak bekerja.


15
2017-09-16 07:00



Sekedar catatan untuk siapa pun yang mencoba menambahkan perpustakaan Objective-C ke Swift: Anda harus menambahkan -ObjC di Pengaturan Build -> Menautkan -> Bendera Linker Lainnya.


7
2018-03-20 17:53



Setelah Anda membuat header Bridging, pergi ke Pengaturan Build => Cari untuk "Objektif-C Bridging Header".

Tepat di bawah Anda akan menemukan file "" Objective-C Generated Interface Header Name ".

Impor file itu di pengontrol tampilan Anda.

Contoh: Dalam kasus saya: "Dauble-Swift.h"

eEter image description here


3
2017-11-25 08:29