Tidak dapat menggunakan kelas Swift di dalam Objective-C

260

Saya mencoba mengintegrasikan Swiftkode dalam aplikasi saya. Aplikasi saya ditulis Objective-Cdan saya menambahkan sebuah Swiftkelas. Saya telah melakukan semua yang dijelaskan di sini . Tapi masalah saya adalah yang Xcodebelum membuat -Swift.hfile, 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 @objctetapi tidak membantu. Apa yang bisa saya lakukan sekarang?

EDIT: Apple mengatakan: "Ketika Anda mengimpor kode Swift ke Objective-C, Anda mengandalkan Xcode-generatedfile 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
    }
}
Astaga
sumber
27
YourProjectName-Swift.hharus 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.hke file di mana Anda ingin menggunakan kelas Swift.
Greg
3
Apakah aplikasi yang sedang Anda bangun dipanggil myProjectModule? The -Swift.hfile 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.hdan itu yang harus Anda sertakan.
vacawama
4
Saya memiliki ini berhasil bekerja di proyek saya, namun tidak ada file yang sebenarnya berakhir -Swift.hditemukan di Mac saya, namun saya dapat memasukkannya. Jadi jangan terpaku mencari file seperti itu. Pastikan Anda memberi nama dengan benar.
vacawama
2
@vacawama Perhatikan bahwa Anda dapat melihat konten setelah menambahkan pernyataan impor ke file Objective-C dengan mengklik perintah pada impor seolah-olah Anda sedang mengunjungi file header lainnya.
Kendall Helmstetter Gelner
4
Saya harus menggunakan#import <MyProjectName/MyProjectName-Swift.h>
Oliver Pearmain

Jawaban:

516

Saya menghabiskan sekitar 4 jam mencoba mengaktifkan Swiftdi Xcodeproyek berbasis Objective-C saya . myproject-Swift.hFile saya berhasil dibuat, tetapi file saya Xcodetidak melihat file saya Swift-classes. Jadi, saya memutuskan untuk membuat Xcodeproyek 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:

  1. Buat *.swiftfile baru (dalam Xcode) atau tambahkan dengan menggunakan Finder.
  2. Buat Objective-C bridging headerketika Xcode bertanya tentang hal itu.
  3. Terapkan kelas Swift Anda:

    import Foundation
    
    // use @objc or @objcMembers annotation if necessary
    class Foo {
        //..
    }
  4. Buka Pengaturan Bangun dan periksa parameter ini:

    • Mendefinisikan modul: YES

      Salin & Tempel nama parameter di bilah pencarian

    • Nama Modul Produk: myproject

      Pastikan Nama Modul Produk Anda tidak mengandung karakter khusus

    • Pasang Header Kompatibilitas Objective-C: YES

      Setelah Anda menambahkan *.swiftfile ke proyek properti ini akan muncul di Pengaturan Bangun

    • Header Antarmuka Dihasilkan Objective-C: myproject-Swift.h

      Header ini dibuat secara otomatis oleh Xcode

    • Objective-C Bridging Header: $(SRCROOT)/myproject-Bridging-Header.h
  5. Impor header antarmuka Swift di file * .m Anda.

    #import "myproject-Swift.h"

    Jangan memperhatikan kesalahan dan peringatan.

  6. Bersihkan dan bangun kembali proyek Xcode Anda.
  7. Keuntungan!
sig
sumber
2
Adakah yang melihat penyebutan konfigurasi yang diperlukan (setidaknya untuk saya) dalam dokumentasi di: developer.apple.com/library/prerelease/ios/documentation/Swift/… pada langkah 4 di atas? Jika itu saya melewatkannya. Terima kasih @ sig.
Morkrom
2
Masalah saya jauh lebih sederhana - saya tidak dapat menemukan file "myproject-Swift.h"sehingga sepertinya saya tidak berfungsi. Rupanya, file ini tidak terlihat di navigator proyek.
Asaf
6
@ Asaf Sebenarnya, ya, file ini dibuat secara otomatis oleh Xcode dan mencari di path-build proyek Anda. Jadi, Anda dapat menemukan file ini secara manual di Finder / Console atau membukanya langsung di Xcode dengan menggunakan Cmd + LeftClick on #import "myproject-Swift.h".
sig
1
Bagi saya # 5 sudah cukup untuk memperbaiki masalah !!
Pencakar langit
12
Dengan 4 jam itu, Anda menghemat ratusan jam kami, Terima kasih banyak :) Disimpan dalam Favoritku;)
Abo3atef
65

Jangan membuat file header sendiri. Hapus yang Anda buat.

Pastikan kelas Swift Anda ditandai dengan @objcatau mewarisi dari kelas yang berasal (langsung atau tidak langsung) dari NSObject.

Xcode tidak akan menghasilkan file jika Anda memiliki kesalahan kompiler dalam proyek Anda - pastikan proyek Anda dibangun dengan bersih.

Tagihan
sumber
8
menjadi mampu adalah kunci bagi saya. Tidak dapat membangun karena tidak dapat menemukan file -swift.h saya, tetapi tidak dapat menemukan file -swift.h saya karena tidak dapat membangun: /
anders
13
@dan saat terperangkap dalam siklus itu, Anda dapat menggunakan find ~/library/Developer/Xcode/DerivedData/ -name "*-Swift.h"|xargs basename|sort -uuntuk melihat apakah file itu dibuat dengan nama yang tidak terduga seperti untuk saya. :)
CodeReaper
38

Izinkan Xcode melakukan tugasnya, jangan tambahkan / buat sundulan Swift secara manual. Cukup tambahkan @objc sebelum ex Swift class Anda.

@objc class YourSwiftClassName: UIViewController

Dalam pengaturan proyek Anda cari bendera di bawah ini dan ubah menjadi YA (Baik Proyek dan Target)

Defines Module : YES
Always Embed Swift Standard Libraries : YES
Install Objective-C Compatibility Header : YES

Kemudian bersihkan proyek dan bangun satu kali, setelah build berhasil (mungkin seharusnya) impor file header di bawah ini di file objektif-c Anda .m

#import "YourProjectName-Swift.h" 

Boooom!

Bharat Modi
sumber
1
Terima kasih, ini luar biasa sederhana dan menyelesaikan masalah saya.
Felipe
Saya tidak melihat satu pun dari opsi ini di Pengaturan Bangun (Xcode 7.3.1). Apa yang harus saya lakukan?
iosdude
1
^ Harus beralih dari Basicke Alldi bilah atas.
iosdude
1
Embedded Content Contains Swiftdiubah menjadi Always Embed Swift Standard Librariesdengan Xcode 8: stackoverflow.com/questions/38792650/…
William Grand
@ WilliamGrand Terima kasih atas sarannya, memperbarui jawabannya.
Bharat Modi
28

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

#import <ProductName/ProductModuleName-Swift.h>

dari pada

#import "ProductModuleName-Swift.h"

sesuai dokumentasi Apel pada Mix & Match untuk target kerangka kerja.

Astaga
sumber
1
@dinesharjani Senang saya bisa membantu! :)
Jeehut
Bagaimana dengan target bundel?
Iulian Onofrei
14

Pastikan proyek Anda mendefinisikan modul dan Anda telah memberi nama pada modul tersebut. Kemudian bangun kembali, dan Xcode akan membuat -Swift.hfile header dan Anda akan dapat mengimpor.

Anda dapat mengatur definisi modul dan nama modul dalam pengaturan proyek Anda.

Leo Natan
sumber
14

Detail: Proyek Objective-C dengan kode Swift 3 di Xcode 8.1

Tugas:

  1. Gunakan swift enum di kelas objektif-c
  2. Gunakan objektif-c enum di kelas cepat

SAMPEL PENUH

1. Kelas Objective-C yang menggunakan Swift enum

ObjcClass.h

#import <Foundation/Foundation.h>

typedef NS_ENUM(NSInteger, ObjcEnum) {
    ObjcEnumValue1,
    ObjcEnumValue2,
    ObjcEnumValue3
};

@interface ObjcClass : NSObject

+ (void) PrintEnumValues;

@end

ObjcClass.m

#import "ObjcClass.h"
#import "SwiftCode.h"

@implementation ObjcClass

+ (void) PrintEnumValues {
    [self PrintEnumValue:SwiftEnumValue1];
    [self PrintEnumValue:SwiftEnumValue2];
    [self PrintEnumValue:SwiftEnumValue3];
}

+ (void) PrintEnumValue:(SwiftEnum) value {
    switch (value) {
        case SwiftEnumValue1:
            NSLog(@"-- SwiftEnum: SwiftEnumValue1");
            break;
            
        case SwiftEnumValue2:
        case SwiftEnumValue3:
            NSLog(@"-- SwiftEnum: long value = %ld", (long)value);
            break;
    }
}

@end

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:

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Jika kompiler tidak dapat menemukan kode Swift file tajuk Anda, cobalah untuk mengkompilasi proyek.

2. Kelas Swift yang menggunakan Objective-C enum

import Foundation

@objc
enum SwiftEnum: Int {
    case Value1, Value2, Value3
}

@objc
class SwiftClass: NSObject {
    
    class func PrintEnumValues() {
        PrintEnumValue(.Value1)
        PrintEnumValue(.Value2)
        PrintEnumValue(.Value3)
    }
    
    class func PrintEnumValue(value: ObjcEnum) {
        switch value {
        case .Value1, .Value2:
            NSLog("-- ObjcEnum: int value = \(value.rawValue)")
            
        case .Value3:
            NSLog("-- ObjcEnum: Value3")
            break
        }
        
    }
}

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.

masukkan deskripsi gambar di sini

Anda dapat mengubah menjembatani nama file header di sini:

masukkan deskripsi gambar di sini

Bridging-Header.h

#import "ObjcClass.h"

Pemakaian

#import "SwiftCode.h"
...
[ObjcClass PrintEnumValues];
[SwiftClass PrintEnumValues];
[SwiftClass PrintEnumValue:ObjcEnumValue3];

Hasil

masukkan deskripsi gambar di sini


LEBIH BANYAK SAMPEL

Langkah-langkah integrasi penuh Objective-c dan Swift yang dijelaskan di atas . Sekarang saya akan menulis beberapa contoh kode lainnya.

3. Panggil kelas Swift dari kode Objective-c

Kelas cepat

import Foundation

@objc
class SwiftClass:NSObject {
    
    private var _stringValue: String
    var stringValue: String {
        get {
            print("SwiftClass get stringValue")
            return _stringValue
        }
        set {
            print("SwiftClass set stringValue = \(newValue)")
            _stringValue = newValue
        }
    }
    
    init (stringValue: String) {
        print("SwiftClass init(String)")
        _stringValue = stringValue
    }
    
    func printValue() {
        print("SwiftClass printValue()")
        print("stringValue = \(_stringValue)")
    }
    
}

Kode objektif-C (kode panggilan)

SwiftClass *obj = [[SwiftClass alloc] initWithStringValue: @"Hello World!"];
[obj printValue];
NSString * str = obj.stringValue;
obj.stringValue = @"HeLLo wOrLd!!!";

Hasil

masukkan deskripsi gambar di sini

4. Panggil kelas Objective-c dari kode Swift

Kelas Objective-C (ObjcClass.h)

#import <Foundation/Foundation.h>

@interface ObjcClass : NSObject
@property NSString* stringValue;
- (instancetype) initWithStringValue:(NSString*)stringValue;
- (void) printValue;
@end

ObjcClass.m

#import "ObjcClass.h"

@interface ObjcClass()

@property NSString* strValue;

@end

@implementation ObjcClass

- (instancetype) initWithStringValue:(NSString*)stringValue {
    NSLog(@"ObjcClass initWithStringValue");
    _strValue = stringValue;
    return self;
}

- (void) printValue {
    NSLog(@"ObjcClass printValue");
    NSLog(@"stringValue = %@", _strValue);
}

- (NSString*) stringValue {
    NSLog(@"ObjcClass get stringValue");
    return _strValue;
}

- (void) setStringValue:(NSString*)newValue {
    NSLog(@"ObjcClass set stringValue = %@", newValue);
    _strValue = newValue;
}

@end

Kode cepat (kode panggilan)

if let obj = ObjcClass(stringValue:  "Hello World!") {
    obj.printValue()
    let str = obj.stringValue;
    obj.stringValue = "HeLLo wOrLd!!!";
}

Hasil

masukkan deskripsi gambar di sini

5. Gunakan ekstensi Swift dalam kode Objective-c

Ekstensi cepat

extension UIView {
    static func swiftExtensionFunc() {
        NSLog("UIView swiftExtensionFunc")
    }
}

Kode objektif-C (kode panggilan)

[UIView swiftExtensionFunc];

6. Gunakan ekstensi Objective-c dalam kode cepat

Ekstensi Objective-C (UIViewExtension.h)

#import <UIKit/UIKit.h>

@interface UIView (ObjcAdditions)
+ (void)objcExtensionFunc;
@end

UIViewExtension.m

@implementation UIView (ObjcAdditions)
+ (void)objcExtensionFunc {
    NSLog(@"UIView objcExtensionFunc");
}
@end

Kode cepat (kode panggilan)

UIView.objcExtensionFunc()
Bodnarchuk dengan mudah
sumber
Sampel-sampel ini sangat membantu, terima kasih! Dan untuk Swift 4+, kita perlu menambahkan @objcMembersdi depan kelas. Karena @objcinferensi 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 .
Hustlion
11

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.hatau ganti nama modul dalam pengaturan.

Max Mikheyenko
sumber
10
Saya bodoh. Saya menambahkan nama Class dan kemudian menambahkan "-Swift". Ternyata itu nama "modul". +1 untuk membuat saya menyadari hal ini.
HotFudgeSunday
2
Orang tolol lain di sini yang mengira itu adalah nama kelas!
Charlie Martin
9

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 cari Swift.hdi folder Data Turunan Anda. Anda harus menemukan tajuk Swift di sana.

Saya punya masalah, bahwa Xcode mengubah nama saya my-Project-Swift.hmenjadi my_Project-Swift.hXcode tidak suka "." "-"simbol dll. Dengan metode di atas, Anda dapat menemukan nama file dan mengimpornya ke kelas Objective-C.

brainray
sumber
1
Ini juga menyelesaikan masalah saya. Dalam file .m saya, saya mengimpor file seperti ini #import "my_project-Swift.h" dan nama proyek saya yang sebenarnya adalahmy-project
Bhavin_m
Perhatian- bukan hanya "." "-" juga spasi :(
user1105951
8

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.

Svitlana
sumber
Terima kasih atas kepala, sobat.
Felipe
Jawaban ini membantu saya dan menyelamatkan hari saya. Yang penting daripada Xcode menghasilkannya secara otomatis dan itu file TERSEMBUNYI. Saya membuat "myProject-Swift.h" sendiri dan itu tidak berfungsi.
C0mrade
5

@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):

  1. Nama Modul Produk: $ (PRODUCT_NAME: c99extidentifier)
  2. Mendefinisikan Modul: TIDAK
  3. Konten Tertanam Mengandung Swift: NO
  4. Instal Header Kompatibilitas Objective-C: YA
  5. Objective-C Bridging Header: ProjectName-Bridging-Header.h

Poin terakhir (5) sangat penting. Saya meletakkannya hanya di bagian kedua (bidang Target), bidang Proyek harus dibiarkan kosong: masukkan deskripsi gambar di siniJika tidak, itu tidak menghasilkan file "Project-Swift.h" yang tepat untuk saya (tidak termasuk metode cepat).

Darius Miliauskas
sumber
1
juga tautan bermanfaat: ericasadun.com/2014/08/21/…
Darius Miliauskas
1
Terima kasih Terima kasih Terima kasih banyak @DariusMiliauskas hanya membuatnya bekerja dengan tautan Anda
a4arpan
1
@DariusMiliauskast terima kasih banyak! 5 poin juga memecahkan masalah bagi saya dalam proyek Xcode lama
tatiana_c
Define Modulesseharusnya No??
Sunil Chauhan
@ SunilChauhan, Ya, ini hanya digunakan untuk kerangka .
Iulian Onofrei
5

Ada dua syarat,

  • Gunakan file cepat Anda dalam file c objektif.
  • Gunakan file c tujuan Anda dalam file cepat.

Jadi, untuk tujuan itu, Anda harus mengikuti langkah-langkah ini:

  • Tambahkan file cepat Anda dalam proyek objektif-c atau sebaliknya.
  • Buat file header (.h).
  • Pergi ke Pengaturan Bangun dan lakukan langkah-langkah di bawah ini dengan pencarian,

    1. cari teks "brid" ini dan tetapkan path file header Anda.
    2. "Defines Module": YES.
    3. "Selalu Embed Swift Standard Library": YES.
    4. "Instal Header Kompatibilitas Objective-C": YES.

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,

  #import "YourProjectName-Swift.h"

Gunakan file c tujuan Anda dalam file cepat.

Dalam hal itu, Di file header Anda, tulis ini,

  #import "YourObjective-c_FileName.h"

Saya harap ini akan membantu Anda.

vikas prajapati
sumber
4

Untuk Swift 5:

  1. Tambahkan @objckata kunci ke kelas dan metode Anda
  2. Tambahkan publickata kunci ke kelas dan metode Anda
  3. Biarkan kelas Anda mewarisi dari NSObject
  4. Bangun Proyek
  5. Masukkan #import "MyProject-Swift.h"file Objective-C Anda

    @objc
    public class MyClass: NSObject {
    
        @objc
        public func myMethod() {
    
        }
    }
Nico S.
sumber
"Tambahkan kata kunci @objc ke kelas dan metode Anda" - sama untuk Swift 4
Krzysztof Skrzynecki
3

Dalam kasus saya, terlepas dari langkah-langkah ini:

  1. Nama Modul Produk: myproject
  2. Definisikan Modul: YES
  3. Konten Tertanam Berisi Cepat: YES
  4. Instal Header Kompatibilitas Objective-C: YA
  5. Objective-C Bridging Header: $ (SRCROOT) /Sources/SwiftBridging.h

Saya harus meletakkan kelas sebagai publik untuk membuat file productName-Swift.h :

import UIKit

   @objc public class TestSwift: NSObject {
       func sayHello() {
          print("Hi there!")
       }
   }
93sauu
sumber
2

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 ...

Darren Ehlers
sumber
@ <kelas spesifik>; harus didefinisikan, dan kemudian proyek yang menggunakan akan melihat file-file itu.
Nikita
2

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.

Dani.Rangelov
sumber
Saya benar-benar mengabaikan ini dengan target berbeda untuk pementasan dan produksi. Terima kasih atas jawaban Anda!
Benjamin Martin
Apa artinya "terlampir"?
Iulian Onofrei
"terlampir" = "anggota", mereka harus terdaftar sebagai anggota target
Dani.Rangelov
1

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.

  1. dalam kasus saya, saya punya ruang dalam nama proyek saya dan xcode ganti ini '_'
pengguna1105951
sumber
1

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.

Boris
sumber
0

Saya memiliki kesalahan yang sama: myProjectModule-Swift.hfile tidak ditemukan ", tetapi, dalam kasus saya, alasan sebenarnya ada dalam target penyebaran yang salah:" Swifttidak tersedia di OS X lebih awal dari 10.9; harap setel MACOSX_DEPLOYMENT_TARGETke 10.9 atau lebih baru (saat ini '10 .7 ') "jadi, ketika saya mengubah target penempatan menjadi 10.9 - proyek telah berhasil dikompilasi.

slavik
sumber
0

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.

Justin Domnitz
sumber
0

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.

sepatu kuda7
sumber
0

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.

coolcool1994
sumber
0

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 masukkan deskripsi gambar di sini

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.

Techno Mag
sumber
0

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 librarydengan penambahan selanjutnya:

Paparkan API Swift. Untuk menggunakan fungsi Swift dari Objective-C [Tentang]

Setelah membangun, Anda harus menemukan <product_name>-Swift.hfile yang seharusnya berada di DerivedSources [File tidak ditemukan]

Konsumen Objective-C dengan perpustakaan statis Swift

Drag and dropbiner ke proyek Xcode [Tentang]

Link Library[Simbol yang tidak terdefinisi] [Tautan vs. Sematan]

Project editor -> select a target -> General -> Linked Frameworks and Libraries -> add -> Add Others... -> point to `lib<product_name>.a` file
//or
Project editor -> select a target -> Build Phases -> Link Binary With Libraries -> add -> Add Others... -> point to `lib<product_name>.a` file

Tambahkan Library Search paths[Perpustakaan tidak ditemukan untuk] [Jalur rekursif]

Project editor -> select a target -> Build Settings -> Search Paths -> Library Search paths -> add path to the parent of `lib<product_name>.a` file

Tambahkan Header Search Paths[Modul tidak ditemukan] [Jalur rekursif]

Project editor -> select a target -> Build Settings -> Search Paths -> Header Search Paths -> add path to generated `<product_name>-Swift.h` file 

Tambahkan kosong .swift fileke proyek Objective-C. [Simbol yang tidak terdefinisi] Ketika Xcode meminta tekan Create Bridging Header(itu akan membuat module_name-Bridging-Header.h) dan mengatur path ke file ini di

Project editor -> select a target -> Build Settings -> Swift Compiler - General -> Objective-C Bridging Header

Impor modul ke kode klien Objective-C [File tidak ditemukan] [module_name]

#import "module_name-Swift.h"

Lebih banyak contoh di sini

yoAlex5
sumber
0

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.

Bill Chan
sumber
1
Apakah Anda mencoba menambahkan @objcsebelum deklarasi kelas batin?
dnnagy
terima kasih @ dnnagy, periksa bahwa itu bukan masalah sintaksis.
Bill Chan
-1

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.

onemoreanimal
sumber
Sumber Daya Salin Bundel tidak boleh menyertakan kode sumber
Bill Chan