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.