Swift kodunu Objective-C'ye nasıl aktarabilirim?


281

Swift'te bir kütüphane yazdım ve Objective-C ile yazılmış mevcut projeme aktaramadım.

İçe aktarmanın herhangi bir yolu var mı?

#import "SCLAlertView.swift" - 'SCLAlertView.swift' file not found

9
Bu projeyi seviyorum!
— SleepsOnNewspapers

Yanıtlar:


430

İçe aktarmanız gerekiyor TargetName-Swift.h. Hedef ad olduğunu unutmayın - diğer yanıtlar sınıf adını kullanma hatasını yapar.

Bu tek dosya, projenizdeki açıklamalı @objcveya devralınan tüm Swift sınıfları için Objective-C arabirimlerini tanımlayan otomatik olarak oluşturulan bir üstbilgidir NSObject.

hususlar:

  • Hedef adınız boşluk içeriyorsa, bunları alt çizgi ile değiştirin (ör. My ProjectOlur My_Project-Swift.h)

  • Hedefiniz bir çerçeveyse, içe aktarmanız gerekir <TargetName/TargetName-Swift.h>

  • Swift dosyanızın hedefin üyesi olduğundan emin olun


5
İçe aktarma işleminizde Swift dosya adını kullanmaya çalışırsanız, "Beklenen"; ' msgstr "üst düzey bildirgeden sonra". "İthalat Vakfı" ndan sonra Swift dosyanızda.
— louielouie

8
EDIT: Not: bunun çalışması için bir proje modülü adı tanımlanmalıdır ZORUNLU. Bkz. Stackoverflow.com/a/24064015/2085743
— Ruben Martinez

7
Sadece proje adınızda herhangi bir boşluk veya özel karakter varsa, bunları "Uygulamam" gibi alt çizgilerle değiştirmeniz gerektiğini unutmayın. "My_App-Swift.h"
— Hola Soy Edu Feliz Navidad

84
Bu neden bu kadar zor ve kötü belgelenmiş?
— uchuugaka

3
@lelelo Hayır, bu dosya bunun tersidir. Köprüleme başlığı geliştirici tarafından yazılır ve Objective-C ve C sembollerini Swift kodunuza getirmenizi sağlar. Target-Swift.h dosyası otomatik olarak oluşturulur ve Objective-C / C kodunuzun Swift sembollerine erişmesini sağlar.
— Bill

154

Apple web sitesinden talimatlar:

Swift kodunu aynı çerçeveden Objective-C'ye almak için

Derleme Ayarları altında , Paketleme'de , bu çerçeve hedefi için Modül Tanımla ayarının Evet olarak ayarlandığından emin olun . Bu sözdizimini kullanarak ve uygun adları değiştirerek Swift kodunu bu çerçeve hedefinden bu çerçeve hedefi içindeki herhangi bir Objective-C .m dosyasına alın:

#import "ProductName-Swift.h"

Revizyon:

"ProductName-Swift.h" dosyasını yalnızca .m dosyalarına alabilirsiniz.

Hedefinizdeki Swift dosyaları, bu içe aktarma ifadesini içeren Objective-C .m dosyalarında görünür olacaktır.

Döngüsel referansları önlemek için Swift'i bir Objective-C başlık dosyasına aktarmayın. Bunun yerine, bir Swift sınıfını bir Objective-C başlığında kullanacağını bildirebilirsiniz. Bir Swift sınıfını Objective-C'de alt sınıflandıramayacağınızı unutmayın.

resim açıklamasını buraya girin


2
"ProductName-Swift.h" dosyasını yalnızca .m dosyalarına içe aktarmama yardımcı oldu. .Pch dosyasına aynı eklemek "CLLocationManagerDelegate 'için protokol bildirimi bulunamıyor;' NSLayoutManagerDelegate 'mi demek istediniz?"
— Alphonse R. Dsouza

@AJit doğrudan değil, belgeler söylüyor. En kolay yol, Objective-C ++ 'ın anladığı biçimde tercüme eden bir Objective-C sınıfı oluşturmaktır. developer.apple.com/library/ios/documentation/Swift/Conceptual/…
— Alejandro Iván

1
Türetmek zorunda olduğunu unutmayın NSObject!!! hemen bir class Blah an beyan edip çalışmasını sağlayamazsınız . olması gerekiyorclass Blah : NSObject
— David T.

Bazı yanıtlar için bu yanıtı okumaya değer: stackoverflow.com/questions/26328034/… Ne yaptığınıza bağlı olarak: #import <ProductName / ProductModuleName-Swift.h> #import <ProductModuleName-Swift.h> #import <NewTestApp / NewTestApp -Swift.h>
— inigo333

Bir Swift uzantısını içe aktarmak istiyorsanız ne olur?
— Ricardo

150

İşte yapmanız gerekenler:

  1. Objective-C ile yeni bir proje oluşturun

  2. Yeni bir .swiftdosya   oluştur

    • Bir pop-up penceresi görünür ve soracaktır "Başlığını köprüleme bir Objective-C yapılandırmak istediğinizden" .
    • Evet'i seçin .
  3. Xcode Project dosyanızı tıklayın

  4. Yapı Ayarları'nı tıklayın

  5. Arama çubuğunu bulun ve Defines Module'ü arayın .

  6. Değeri Evet olarak değiştirin .

  7. Ürün Modülü Adını Ara .

  8. Değeri projenizin adıyla değiştirin.

  9. Uygulama temsilcisine aşağıdakileri ekleyin: #import "YourProjectName-Swift.h"


Not: Swift dosyanızı her kullanmak istediğinizde aşağıdaki satırı içe aktarmanız gerekir:

#import "YourProjectName-Swift.h"


1
Değerini değiştirme Defines moduleiçinde Build settingshiç Yesişleri benim için sabit ne!
— Zakaria Braksa

Gömülü İçerik Swift İçerir: EVET bunu da kullanın
— Mohit

4
iyi cevap ama 7-8 arası adımlar Xcode 7.3.1 ve üstü için gerekli değildir
— Sam B

Benim için çalıştı! Teşekkürler.
— itsdamslife

1
Sadece bu eklemek istediğiniz YourProjectNamein #import "YourProjectName-Swift.h"proje adı özel karakterler içeriyorsa Faydalı adım 8 den projenin adı olacaktır ve emin biçimlendirmeniz gerektiğini tam olarak nasıl değildir.
— Chuck Boris

40

Cocoapods kullanıyorsanız ve bir ObjC projesinde bir Swift bölmesi kullanmaya çalışıyorsanız, şunları yapabilirsiniz:

@import <FrameworkName>;

resim açıklamasını buraya girin


1
Çok teşekkürler! günümü kurtardın.
— Esha

Cocoapods aracılığıyla hızlı bir kütüphane kurduğumuzda bu bir cazibe gibi çalışır. Oy verildi !!!
— NSPratik

21

Proje dosyanızda ayarları derleyin ve "Objective-C Oluşturulmuş Arabirim Üstbilgi Adı" nı arayın . Bu özelliğin değeri, eklemeniz gereken addır.

"Ürün Modülü Adı" özelliğiniz (yukarıdaki özelliğin varsayılan olarak bağımlı olduğu özellik), test / hata ayıklama / bırakma / vb. özel bir ad ayarlayarak varyasyon.


15

SwiftDosyayı içeri aktarmak Objective-c, importdüzgün bir şekilde yapılmazsa bu hataya neden olabilir .

NOT: Swift dosyalarını harici olarak içe aktarmak zorunda değilsiniz, hızlı dosyalarla ilgilenen bir dosyayı içe aktarmanız yeterlidir.

Eğer düzenlendi / Kopyalanan Swift dosya içindeki Objective-C projesi . Otomatik olarak bir köprüleme başlığı oluşturacaktı.

Kontrol Objective-C Generated Interface Header Namede Targets -> Build Settings.

resim açıklamasını buraya girin

Yukarıdakilere dayanarak, olduğu gibi ithal edeceğim KJExpandable-Swift.h.

Sizin en olacak TargetName-Swift.hdurumlarda, TargetNameproje adı veya başka bir hedefe dayalı farklılık senin ekleyip bunun üzerinde çalışan olabilir.

Hedefimin altında olduğu gibi KJExpandable,KJExpandable-Swift.h
resim açıklamasını buraya girin


12

İlk adım:-

Proje Hedefi -> Derleme Ayarı -> Ara ('Tanımla') -> Modül güncelleme değerini tanımla Hayır seçeneğini Evet olarak seçin

"Modülü Tanımlar": EVET .

"Her Zaman Swift Standart Kitaplıklarını Göm": EVET .

"Objective-C Uyumluluk Üstbilgisini Yükle": EVET .

resim açıklamasını buraya girin

İkinci adım:-

Aşağıdaki gibi Objective C ".h" Dosya Swift dosya Sınıfı ekleyin

#import <UIKit/UIKit.h>

@class TestViewController(Swift File);

@interface TestViewController(Objective C File) : UIViewController

@end

'ProjectName (Project Name) -Swift.h' dosyasını Objective C ".m" dosyasına aktar

//TestViewController.m 
#import "TestViewController.h"

/*import ProjectName-Swift.h file to access Swift file here*/

#import "ProjectName-Swift.h"

Sınıfın ileri bildirimi (@class) çok iyi bir nokta! Teşekkürler!
— Philipp Otto

10

Swift kodunu aynı çerçevede Objective-C dosyalarınıza aktarıyorsanız bir uyarı var . Çerçeve adını ve açılı ayraçları belirterek yapmanız gerekir:

#import <MyFramework/MyFramework-Swift.h>

MyFramework"Ürün Modülü Adı" oluşturma ayarı ( PRODUCT_NAME = MyFramework).

Basitçe eklemek #import "MyFramework-Swift.h"işe yaramaz. Yerleşik ürünler dizinini kontrol ederseniz (böyle bir #importek eklenmeden önce, hedefte bazı Swift kodları olan en az bir başarılı derleme elde etmiş olursanız), dosyayı MyFramework-Swift.hyine de Headersdizinde görmelisiniz .


8

Swift 4'te oluşturulan ve daha sonra Objective-C dosyaları eklediyseniz, bunu şu şekilde yapın:

@objcMembers
public class MyModel: NSObject {
    var someFlag = false         
    func doSomething() {         
        print("doing something")
    }
}

Referans: https://useyourloaf.com/blog/objc-warnings-upgrading-to-swift-4/


Benim kodunda, ben İşe yaramıyor swift 3. den Swift 4.2 için güncellenmiş sonra
— SNarula

ne hatası alıyorsun Swift4.2 ve onun iyi çalışıyor yukarıdaki kod kullanmış.
— Prashant Bhayani

Tamam bu harika.
— Prashant Bhayani

4

Aynı projede Swift ve Objective C ile ilgili yayın öncesi notlara göz atın

https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-XID_75

İçe aktarıyor olmalısınız

#import "SCLAlertView-Swift.h"

3
Bana şu hatayı gösterdi: 'SCLAlertView-Swift.h' dosyası bulunamadı.
— Viktor Radchenko

2
Proje adı olmalı, dosya adı değil - cevabımı görün.
— Bill

1
Doküman bağlantısı için teşekkürler. Bu referans olarak kullanışlıdır.
— louielouie

2
Sağlanan bağlantıdan alıntı yapmak için: The name of this header is your product module name followed by adding "-Swift.h".Bu, yazdığınız gibi sınıf adı değil, ürün modülünüzün adı ve sadece belirli bir dosyayı değil, tüm hızlı dosyaları içe aktarmayı önemsiyor
— Chris

4

Oluşturmaya çalıştığınız hedefin Yapı Ayarlarında "Hedef-C Oluşturulmuş Arayüz Üstbilgi Adı" nı arayın (diyelim MyApp-Swift.h) ve #import "MyApp-Swift.h"erişmeye çalıştığınız kaynak dosyaya bu ayarın ( ) değerini içe aktarın Swift API'larınız.

Bu alan için varsayılan değer şudur $(SWIFT_MODULE_NAME)-Swift.h. "Objective-C Oluşturulmuş Arabirim Üstbilgi Adı" ayarının değer alanını çift tıklarsanız görebilirsiniz.

Ayrıca, modül adınızda tire varsa (diyelim ki My-App), $(SWIFT_MODULE_NAME)tüm tirelarda alt çizgilerle değiştirilir. O zaman eklemeniz gerekecek #import "My_App-Swift.h".


Onaylanandan daha iyi. Atılganlar 20 dakika boşa asla geri dönmeyeceğim haha.
— Roi Mulia

3

Swift dosyasını Objective-C sınıfında kullanmak istiyorsanız , Xcode 8'den itibaren aşağıdaki adımları takip edebilirsiniz:

Projeyi Objective-C'de oluşturduysanız:

  1. Yeni Swift dosyası oluştur
  2. Xcode otomatik olarak Bridge-Header dosyasını isteyecektir
  3. Oluşturun
  4. Objective-C denetleyicinize "ProjectName-Swift.h" dosyasını içe aktarın (uygulamada arabirimde içe aktarma) (projenizde ad arasında boşluk varsa, "Project_Name-Swift.h" alt çizgisini kullanın)
  5. Swift'te Objective-C sınıfınıza erişebileceksiniz.

Derleyin ve aşağıdaki gibi linker hatası üretecekse: x86_64 veya armv 7 mimarisi için Swift dilinin (3.0) önceki dosyalardan (2.0) daha yeni sürümüyle derlendi

Cihazınızda bir değişiklik daha yapın

  1. Xcode -> Proje -> Hedef -> Derleme Ayarları -> Eski Swift Dil Sürümünü Kullan -> Evet

Oluşturun ve çalıştırın.


1
eski hızlı dil sürümü bu seçeneği kullanmıyorum
— rd_

1

Kısa çizgilere ve alt çizgilere dikkat edin, bunlar karıştırılabilir ve Proje Adınız ve Hedef adınız SWIFT_MODULE_NAME ile aynı olmayacak.

Kısa çizgiler ve alt çizgiler


1
#import <TargetName-Swift.h>

#import <klavyesinden girdiğinizde göreceksiniz ve otomatik olarak Xcode size tavsiyede bulunacaktır.


-1

Projenin içindeki .PCH dosyasını bulun. ve sonra ekle #import "YourProjectName-Swift.h"Bu sınıf üstbilgilerini alır. Böylece belirli bir dosyaya aktarmanız gerekmez.

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