Objective-C içinde Swift sınıfları kullanılamıyor


260

SwiftUygulamamda kod entegre etmeye çalışıyorum. Uygulamam yazıldı Objective-Cve bir Swiftsınıf ekledim . Burada açıklanan her şeyi yaptım . Ama benim sorunum olduğunu Xcodeoluşturmadıysanız -Swift.hdosyayı, sadece köprü başlıklarını. Bu yüzden ben yarattım, ama aslında boş. Swift'te tüm ObjC sınıflarımı kullanabilirim, ama tam tersini yapamam. Hızlı sınıfımı işaretledim @objcama yardımcı olmadı. Şimdi ne yapabilirim?

DÜZENLEME: Apple diyor ki: "Swift kodunu Objective-C'ye aktardığınızda, Xcode-generatedbu dosyaları Objective-C'ye göstermek için bir başlık dosyasına güveniyorsunuz . [...] Bu başlığın adı ürün modülü adınız ve ardından“ -Swift.h ”."

Şimdi o dosyayı almak istediğinizde, bir hata veriyor:

    //MainMenu.m

    #import "myProjectModule-Swift.h" //Error: 'myProjectModule-Swift.h' file not found

    @implementation MainMenu

İşte FBManager.swift dosyam:

@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
    }
}

27
YourProjectName-Swift.hXcode'un derleme sırasında sizin için otomatik olarak oluşturduğu sihirli bir başlık dosyası olmalıdır (aslında proje tarayıcısında görmezsiniz). Oluşturduğunuz dosyayı silmeyi deneyin #import YourProjectName-Swift.hve Swift sınıflarını kullanmak istediğiniz dosyalara ekleyin .
Greg

3
Oluşturduğunuz uygulamanız denir myProjectModulemi? -Swift.hDosyanın Uygulama adına ile başlamalıdır. İle biten bir dosyanız var -Bridging-Header.hmı? Malısın. Öyleyse, o dosyanın ilk kısmı proje adınızdır. Bu dosya adının ilk kısmını birleştirin ve eklemeniz -Swift.hgereken şey budur.
vacawama

4
Bunu projemde başarılı bir şekilde çalışıyorum, ancak Mac'imde bulunan gerçek bir dosya yok -Swift.hve yine de dahil edebilirim. Öyleyse böyle bir dosya aramaya kalkmayın. Doğru şekilde adlandırdığınızdan emin olun.
vacawama

2
@vacawama İçe aktarma deyimini Objective-C dosyasına ekledikten sonra, başka bir başlık dosyasını ziyaret ediyormuşsunuz gibi içe aktarmayı Komut-Tıklatarak görebileceğinizi unutmayın.
Kendall Helmstetter Gelner

4
#import <MyProjectName/MyProjectName-Swift.h>
Kullanmak

Yanıtlar:


516

Ben etkinleştirmeye çalışırken yaklaşık 4 saat geçirdi Swiftbenim de XcodeObjective-C tabanlı proje. Benimmyproject-Swift.h dosyası başarıyla oluşturuldu ancak benim Xcodegözlerimi görmedik Swift-classes. Bu yüzden yeni bir XcodeObjc tabanlı proje yaratmaya karar verdim ve sonunda doğru cevabı buldum! Umarım bu yazı birine yardımcı olur :-)

Xcode Objc tabanlı proje için adım adım Swift entegrasyonu:

  1. Yeni oluşturmak *.swift dosya (Xcode ile) veya Finder'ı kullanarak ekleyin.
  2. Oluşturduğunuz bir Objective-C bridging headerXcode size bunu sorduğunda zaman .
  3. Swift sınıfınızı uygulayın:

    import Foundation
    
    // use @objc or @objcMembers annotation if necessary
    class Foo {
        //..
    }
  4. Derleme Ayarları'nı açın ve şu parametreleri kontrol edin:

    • Modülü tanımlar: YES

      Parametre adını bir arama çubuğuna kopyala ve yapıştır

    • Ürün Modülü Adı: myproject

      Ürün Modülü Adınızın özel karakter içermediğinden emin olun

    • Objective-C Uyumluluk Üstbilgisini Yükleyin: YES

      *.swiftProjeye dosya ekledikten sonra , bu özellik Yapı Ayarlarında görünecektir

    • Objective-C Üretilen Arabirim Başlığı: myproject-Swift.h

      Bu başlık Xcode tarafından otomatik olarak oluşturulur

    • Objective-C Köprüleme Başlığı: $(SRCROOT)/myproject-Bridging-Header.h
  5. Swift arayüz başlığını * .m dosyanıza içe aktarın.

    #import "myproject-Swift.h"

    Hatalara ve uyarılara dikkat etmeyin.

  6. Xcode projenizi temizleyin ve yeniden oluşturun.
  7. Kar!

2
Yukarıdaki 4. adımda yer alan belgelerdeki geliştirici (en azından benim için) için gerekli yapılandırmadan bahseden oldu mu? Eğer öyleyse özledim. Teşekkürler @sig.
Morkrom

2
Sorunum çok daha basitti - dosyayı bulamadım, "myproject-Swift.h"bu yüzden çalışmıyor gibi görünüyor. Görünüşe göre, bu dosya proje gezgininde görünmüyor.
Asaf

6
@Asaf Aslında, bu dosya Xcode tarafından otomatik olarak üretiliyor ve proje oluşturma yolunuzda bulunuyor. Bu nedenle, bu dosyayı Finder / Console'da manuel olarak bulabilir veya Cmd + LeftClick on'u kullanarak doğrudan Xcode'da açabilirsiniz #import "myproject-Swift.h".
sig

1
Bana gelince # 5 sorunu çözmek için yeterliydi!
skywinder

12
Bu 4 saatinizle, yüzlerce saatimizi kurtardınız, Çok teşekkürler :)
Favori'ye

65

Başlık dosyasını kendiniz oluşturmayın. Oluşturduğunuz birini silin.

Swift sınıflarınızın @objc(doğrudan veya dolaylı olarak) türetilmiş bir sınıfla etiketlendiğinden veya bu sınıftan miras aldığından emin olun NSObject.

Projenizde herhangi bir derleyici hatası varsa Xcode dosyayı oluşturmaz - projenizin temiz bir şekilde oluşturulduğundan emin olun.


8
inşa edilebilir olmak benim için anahtardı. -Swift.h dosyamı bulamadığı için oluşturulamadı, ancak -swift.h dosyamı bulamadı çünkü yapılamadı: /
anders

13
@ ve bu döngüde sıkışıp kaldığınızda find ~/library/Developer/Xcode/DerivedData/ -name "*-Swift.h"|xargs basename|sort -u, dosyanın benim gibi beklenmedik bir adla oluşturulup oluşturulmadığını görmek için kullanabilirsiniz . :)
CodeReaper

38

Xcode'un işini yapmasına izin verin, Swift üstbilgisini manuel olarak eklemeyin / oluşturmayın. Swift sınıfınızdan önce @objc eklemeniz yeterlidir.

@objc class YourSwiftClassName: UIViewController

Proje ayarınızda aşağıdaki bayrakları arayın ve EVET olarak değiştirin (Hem Proje hem de Hedef)

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

Sonra projeyi temizleyin ve bir kez derleyin, derleme başarılı olduktan sonra (büyük olasılıkla) objektif-c sınıfı .m dosyanıza başlık dosyasının altına içe aktarın

#import "YourProjectName-Swift.h" 

Boooom!


1
Teşekkürler, bu fevkalade basitti ve sorunumu çözdü.
Felipe

Bu seçeneklerin hiçbirini Derleme Ayarları'nda (Xcode 7.3.1) görmüyorum. Ne yapmalıyım?
iosdude

1
^ Üst çubukta geçiş Basicyapmak zorunda Allkaldı.
iosdude

1
Embedded Content Contains SwiftAlways Embed Swift Standard LibrariesXcode 8 ile değiştirildi : stackoverflow.com/questions/38792650/…
William Grand

@WilliamGrand Öneri için teşekkürler, cevabı güncelledi.
Bharat Modi

28

Ayrıca bir Framework hedefi olanlarınız için de yararlı olabilir :

İthalat beyanı otomatik oluşturulan başlık dosyasının bakar biraz farklı bir uygulaması hedeflerinden. Diğer cevaplarda belirtilen diğer şeylere ek olarak,

#import <ProductName/ProductModuleName-Swift.h>

onun yerine

#import "ProductModuleName-Swift.h"

Çerçeve hedefleri için Mix & Match ile ilgili Apple belgelerine göre .


1
@dinesharjani Yardım edebileceğim için mutluyum! :)
Jeehut

Paket hedefleri ne olacak?
Iulian Onofrei

14

Projenizin bir modül tanımladığından ve modüle bir ad verdiğinizden emin olun. Daha sonra yeniden oluşturun ve Xcode -Swift.hbaşlık dosyasını oluşturacak ve içe aktarabileceksiniz.

Modül tanımını ve modül adını proje ayarlarınızda ayarlayabilirsiniz.


14

Ayrıntılar: Xcode 8.1'de Swift 3 kodu ile Objective-C projesi

Görevler:

  1. Objektif-c sınıfında hızlı numaralandırma kullanma
  2. Hızlı sınıfta objektif-c enum kullanma

TAM ÖRNEK

1. Swift enum kullanan Objective-C sınıfı

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

Objective-C kodunda Swift kodunu algılama

Örneğimde, Objective-C Swift kodu algılamak için SwiftCode.h kullanın. Bu dosya otomatik olarak oluşturulur (bir projede bu başlık dosyasının fiziksel bir kopyasını oluşturmadım) ve yalnızca bu dosyanın adını ayarlayabilirsiniz:

resim açıklamasını buraya girin

resim açıklamasını buraya girin

Derleyici başlık dosyanızı Swift kodu bulamazsa, projeyi derlemeye çalışın.

2. Objective-C enum kullanan Swift sınıfı

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

Swift kodundaki Objective-C kodunu algılama

Köprüleme başlık dosyası oluşturmanız gerekir. Objective-C projesine Swift dosyasını veya hızlı Xcode projesinde Objective-C dosyasını eklediğinizde köprüleme üstbilgisi oluşturmanızı önerir.

resim açıklamasını buraya girin

Köprüleme üstbilgisi dosya adını buradan değiştirebilirsiniz:

resim açıklamasını buraya girin

Köprü Oluşturma-Header.h

#import "ObjcClass.h"

kullanım

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

Sonuç

resim açıklamasını buraya girin


DAHA FAZLA ÖRNEK

Yukarıda açıklanan tam entegrasyon adımları Objective-c ve Swift . Şimdi başka kod örnekleri yazacağım.

3. Objective-c kodundan Swift sınıfını çağırın

Swift sınıfı

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)")
    }
    
}

Objective-C kodu (çağrı kodu)

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

Sonuç

resim açıklamasını buraya girin

4. Swift kodundan Objective-c sınıfını çağırın

Objective-C sınıfı (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

Swift kodu (çağrı kodu)

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

Sonuç

resim açıklamasını buraya girin

5. Objective-c kodunda Swift uzantısını kullanma

Swift uzantısı

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

Objective-C kodu (çağrı kodu)

[UIView swiftExtensionFunc];

6. Hızlı kodda Objective-c uzantısını kullanma

Objective-C uzantısı (UIViewExtension.h)

#import <UIKit/UIKit.h>

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

UIViewExtension.m

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

Swift kodu (çağrı kodu)

UIView.objcExtensionFunc()

Bu örnekler gerçekten faydalı, teşekkür ederim! Ve Swift 4+ için olduğu gibi @objcMembers, sınıfın önüne eklememiz gerekiyor . Çünkü @objcoptimizasyon amacıyla Swift 4'te çıkarım azaltıldı. Örneğin, NSObject türetilmiş bir sınıf içindeki bir özellik artık varsayılan olarak @objc'yi (Swift 3'te olduğu gibi) çıkarmayacaktır. Bu zekayı bu cevaptan aldım .
Hustlion

11

Ben de aynı sorunu vardı ve modül adında özel semboller xcode (benim durumumda tire alt çizgi sona erdi) ile değiştirildi ortaya çıktı. Proje ayarlarında, projenizin modül adını bulmak için "modül adı" nı kontrol edin. Bundan sonra ModuleName-Swift.hmodülü ayarlarda kullanın veya yeniden adlandırın.


10
Ben bir moronum. Ben Sınıf adını ekledikten sonra "-Swift" ekliyordu. Bunun "modül" adı olduğu ortaya çıktı. +1 bunu fark ettiğim için.
HotFudgeSunday

2
Burada sınıf adı olduğunu düşünen başka bir moron!
Charlie Martin

9

Dosya otomatik olarak oluşturulur (burada Xcode 6.3.2'den bahsediyoruz). Ancak, Türetilmiş Veri klasörünüzde olduğu için görmezsiniz. Swift sınıfınızı ile işaretledikten sonra @objc, derleyin Swift.hve Türetilmiş Veri klasörünüzde arayın . Swift başlığını orada bulmalısınız.

Ben Xcode gözlerimi değiştirildi ki sorun vardı my-Project-Swift.hiçin my_Project-Swift.hdeğil sevmez Xcode "." "-"vb sembolleri. Yukarıdaki yöntemle dosya adını bulabilir ve bir Objective-C sınıfına aktarabilirsiniz.


1
Bu da benim sorunumu çözdü. #import "my_project-Swift.h"my-project
.M dosyamda

Dikkat - sadece "." "-" ayrıca boşluklar :(
user1105951

8

.M veya .h dosyasına #import "myProject-Swift.h" yazmanız yeterlidir

PS "myProject-Swift.h" dosyasını gizli dosya denetçisinde bulamazsınız. Ancak uygulama tarafından otomatik olarak oluşturulur.


Uyarı için teşekkürler dostum.
Felipe

Bu cevap bana yardımcı oldu ve günümü kurtardı. Önemli olan Xcode'un otomatik olarak üretilmesinden ve HIDDEN dosyasıdır. "MyProject-Swift.h" yi kendim oluşturuyordum ve işe yaramıyordu.
C0mrade

5

@sig cevap en iyilerinden biridir, ancak eski proje (yeni değil!) ile benim için çalışmadı, bazı değişiklikler gerekiyordu. Bir çok varyasyondan sonra benim için tarifi buldum (XCode 7.2 kullanarak):

  1. Ürün Modül Adı: $ (PRODUCT_NAME: c99extidentifier)
  2. Modülü tanımlar: HAYIR
  3. Gömülü İçerik Swift İçeriyor: HAYIR
  4. Objective-C Uyumluluk Üstbilgisini Yükle: VAR
  5. Objective-C Köprüleme Başlığı: ProjectName-Bridging-Header.h

Son nokta (5) çok önemliydi. Sadece ikinci bölüme koydum (Hedefler alanı), Proje alanı boş bırakılmalıdır: resim açıklamasını buraya girinAksi takdirde, benim için doğru "Project-Swift.h" dosyasını üretmedi (hızlı yöntemler içermiyordu).


1
Ayrıca yararlı bir bağlantı: ericasadun.com/2014/08/21/…
Darius Miliauskas

1
Teşekkürler Teşekkürler Teşekkürler Çok teşekkürler @DariusMiliauskas sadece senin link ile çalışma var
a4arpan

1
@DariusMiliauskasthanks çok! 5 puan da eski Xcode projesinde benim için sorunu çözdü
tatiana_c

Define Modulesolmalı No??
Sunil Chauhan

@SunilChauhan, Evet, sadece framewoks için kullanılır .
Iulian Onofrei

5

İki koşul vardır,

  • Swift dosyanızı objektif c dosyasında kullanın.
  • Objektif c dosyanızı hızlı dosyada kullanın.

Bu nedenle, bu adımları izlemelisiniz:

  • Hızlı dosyanızı obj-c projesine ekleyin veya tam tersini yapın.
  • Üstbilgi (.h) dosyası oluşturun.
  • Git Ayarlar kurmak ve arama ile adımlarına göz gerçekleştirin

    1. "brid" metnini arayın ve başlık dosyanızın yolunu ayarlayın.
    2. "Modülü Tanımlar": EVET.
    3. "Her Zaman Swift Standart Kitaplıklarını Göm": EVET.
    4. "Objective-C Uyumluluk Üstbilgisini Yükle": EVET.

Bundan sonra projenizi temizleyin ve yeniden oluşturun.

Swift dosyanızı objektif c dosyasında kullanın.

Bu durumda, önce dersten önce "@objc" yazıp swift dosyasına yazın.

Bundan sonra, objektif c dosyanıza şunu yazın,

  #import "YourProjectName-Swift.h"

Objektif c dosyanızı hızlı dosyada kullanın.

Bu durumda, başlık dosyanıza şunu yazın,

  #import "YourObjective-c_FileName.h"

Umarım bu sana yardımcı olmuştur.


4

Swift 5 için:

  1. Ekle @objc sınıfınızda ve yöntemlere anahtar kelime
  2. Ekle publicSınıfınıza ve yöntemlerinize anahtar kelime
  3. Sınıfınızın miras almasına izin verin NSObject
  4. Proje Oluştur
  5. #import "MyProject-Swift.h"Objective-C dosyanıza koyun

    @objc
    public class MyClass: NSObject {
    
        @objc
        public func myMethod() {
    
        }
    }

"Sınıfınıza ve yöntemlerinize @objc anahtar sözcüğünü ekleyin" - Swift 4 için aynı
Krzysztof Skrzynecki

3

Benim durumumda, bu adımlar dışında:

  1. Ürün Modül Adı: myproject
  2. Modülü tanımlar: EVET
  3. Gömülü İçerik Swift İçeriyor: EVET
  4. Objective-C Uyumluluk Üstbilgisini Yükle: VAR
  5. Objective-C Köprüleme Başlığı: $ (SRCROOT) /Sources/SwiftBridging.h

Ben productName-Swift.h dosya oluşturmak için sınıfı genel olarak koymak gerekiyor :

import UIKit

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

2

Bir projeye hızlı dosyalar dizini eklemenin işe yaramayacağını keşfettim. Önce dizin için bir grup oluşturmanız, ardından hızlı dosyaları eklemeniz gerekir ...


@ <belirli sınıf>; tanımlanmalı ve ardından projeyi kullanan dosyalar bu dosyaları görecektir.
Nikita

2

Aynı problemim vardı ve sonunda aynı hedeflere bağlı olmadıkları ortaya çıktı. ObjC sınıfı Target1 ve Target2'ye eklenir, Swift sınıfı yalnızca Target1'e eklenir ve ObjC sınıfı içinde görünmez.

Umarım bu birine yardımcı olur.


Bunu sahneleme ve üretim için farklı hedeflerle tamamen gözden kaçırdım. Cevabınız için teşekkür ederim!
Benjamin Martin

"Bağlı" ne demektir?
Iulian Onofrei

"attached" = "üye", hedef üye olarak listelenmelidir
Dani.Rangelov

1

benim sorunum xcode köprü dosyasını oluşturduktan sonra sıkışıp kaldım ama yine de başlık dosya adı MYPROJECTNAME-swift.h hata var

Terminali kontrol ediyorum ve tüm otomatik oluşturulan hızlı köprü dosyalarını araıyorum:

find ~/library/Developer/Xcode/DerivedData/ -name "*-Swift.h"|xargs basename|sort -

xcode'un ne oluşturduğunu görüyorsunuz.

  1. benim durumumda, proje adımda boşluk vardı ve xcode yerine bu '_'

1

Projeye yeni Swift dosyaları eklediğinizde, lütfen bunları doğru hedeflere eklediğinizden emin olun. Lütfen, kullanacağınız her hızlı dosyanın NSObject sınıfını devraldığından ve yapı ayarlarında ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES seçeneği altında @ObjCMembers Change ile YES olarak açıklandığından emin olun. DEFINES_MODULE seçeneği altındaki oluşturma ayarlarında YES olarak değiştirin.


0

Ben de aynı hata var: myProjectModule-Swift.hdosya bulunamadı ", ancak, benim durumumda, gerçek neden yanlış dağıtım hedef oldu:" SwiftOS X 10.9 daha önce kullanılamıyor; lütfen MACOSX_DEPLOYMENT_TARGET10,9 veya daha sonraki bir süreye ayarlayın (şu anda '10, 7'dir) "bu nedenle, dağıtım hedefini 10,9 olarak değiştirdiğimde - proje başarıyla derlendi.


0

Benim sorunum, -swift.h dosyasının otomatik oluşturulmasının CustomDebugStringConvertible'ın bir alt sınıfını anlayamamasıydı. Sınıf yerine NSObject bir alt sınıf olarak değiştirdim. Bundan sonra, -swift.h dosyası artık sınıfı düzgün bir şekilde içeriyordu.


0

Benim objektif-c köprü üstbilgisine sınıf eklemek istiyorum sorunları vardı ve ithal bu obj-c üstbilgileri, onlar hızlı üstbilgi almak için çalışıyorlardı. Bunu beğenmedi.

Bu nedenle, swift kullanan ancak aynı zamanda köprülenen tüm objektif-c sınıflarımda anahtar, başlıklarda ileri sınıf bildirimleri kullandığınızdan emin olmak, ardından .m dosyasındaki "* -Swift.h" dosyasını içe aktarmaktı.


0

Derlemede herhangi bir ayarı değiştirmek veya sınıfa @obj eklemek zorunda değildi.

Tek yapmam gereken, Objective-c projesine Swift sınıfları oluşturduğumda otomatik olarak oluşturulan köprü başlığı oluşturmaktı. Ve sonra sadece yapmak zorunda kaldım

"Bedtime-Swift.h" <dosyasını içe aktarın - bu hızlı dosyayı kullanmak için gereken objektif-c dosyasının içine.


0

tüm yorumları okuduktan ve tekrar okuyup denedikten sonra, Big obj-c projeme hızlı sınıflar eklemeyi başardım. Tüm yardımlarınız için teşekkürler. Süreci daha iyi anlamama yardımcı olan bir ipucu paylaşmak istedim. .M sınıfında, #import "myTargetName-Swift.h" hızlı hedef adının içe aktarma satırına gidin ve anahtarı tıklayın:

command + mouse tıklama -> Tanımlamaya atla resim açıklamasını buraya girin

Orada hızlıdan obj-c'ye tüm çevirileri görebilirsiniz ve obj-c'de yeniden beyan edilen çeşitli fonksiyonları bulacaksınız. Umarım bu ipucu bana yardımcı olduğu kadar yardımcı olacaktır.


0

Objective-C'de Swift Sınıflarını Kullanma

Bir Uygulama Hedefi içindeki kodu içe aktaracaksanız (bir projede Objective-C ve Swift'i karıştırma) #import "<#YourProjectName#>-Swift.h"Swift kodunu Objective-C koduna maruz bırakmak için bir sonraki içe aktarma satırını kullanmalısınız [Bir projede Swift ve Objective-C kodunu karıştırma]

Bu yazıda Swift statik kitaplığının Objective-C koduna nasıl aktarılacağını açıklayacağım

Objective-C tüketici -> Swift statik kitaplığı

Xcode sürüm 10.2.1

Swift statik kitaplığı oluşturma

Takip et Create Swift static library sonraki eklemelerle:

Swift API'sini ortaya çıkarın. Swift'in fonksiyonlarını Objective-C'den kullanmak için [Hakkında]

Oluşturduktan sonra [Dosya bulunamadı]<product_name>-Swift.h içine yerleştirilmesi gereken bir dosya bulmalısınızDerivedSources

Swift statik kitaplığına sahip Objective-C tüketici

Drag and dropXcode projesine ikili [Hakkında]

Link Library[Tanımsız semboller] [Link - Embed bağlantısı]

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

Library Search paths[İçin kütüphane bulunamadı] [Yinelemeli yol] ekle

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

Header Search Paths[Modül bulunamadı] [Yinelenen yol] ekle

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

.swift fileObjective-C projesine boş ekleyin . [Tanımsız semboller] Xcode istendiğinde Oluştur düğmesine basın Bridging Header(oluşturulacaktır module_name-Bridging-Header.h) ve bu dosyaya

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

Modülü Objective-C istemci koduna aktar [Dosya bulunamadı] [module_name]

#import "module_name-Swift.h"

Burada daha fazla örnek


0

XCode 11.3.1:

Bir objc kodunda Swift iç sınıf kullanmak istediğinizde, bu hata "tanımsız sembolü" (rahatsız iç sınıf ve dış sınıf için) için derlemez, oluşturulan "-swift.h" üstbilgisini kontrol ve her iki sınıf Orada.

Saatlerce denedikten sonra iç sınıfı normal bir sınıfa dönüştürdüm ve derler.

Projeyi temizler, DerivedData klasörünü silerim ve derler.


1
@objcİç sınıfın ilanından önce eklemeye çalıştınız mı?
dnnagy

teşekkürler @dnnagy, sözdizimi sorunu olmadığını kontrol etti.
Bill Chan

-1

Yukarıdaki her şeyi yaptıktan sonra hala hatalar aldım. Sorunum, ihtiyacım olan Swift dosyalarının bir nedenle paket kaynaklarına eklenmemesiydi.

Bunu [MyTarget]> Aşama Oluştur> Paket Kaynaklarını Kopyala'ya gidip artı düğmesini tıklayıp Swift dosyalarını ekleyerek düzelttim.


Paket Kaynağını Kopyala kaynak kodu içermemelidir
Bill Chan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.