Xcode 6'da oluşturulmayan Objective-C başlığı


242

Kısa bir süre önce Swift'i mevcut bir projeye eklemek, gerçek dünyayla denemek için çalışıyorum.

Projeye bir Swift kaynak dosyası ekledikten sonra, "Köprüleme Başlığı", yani Swift için Objective-C almakla ilgili hiçbir sorunum yok.

Ancak *-Swift.hSwift sınıflarını @objcObjC sınıflarının işaretli veya alt sınıflarını göstermesi beklenen başlık dosyası hiçbir yerde bulunamaz :-(

Swift'te yazılan yeni alt sınıfımın ana uygulama kodumda (hala Objective-C) nasıl kullanılacağına dair özel bir talimat görmüyorum.

Ben baş geliştirici olduğum app oldukça büyük bir kod tabanı (70.000 satır) vardır, bu yüzden bir seferde geçiş söz konusu değil.


5
Evet öyle. Gerçekten, bu Swift-> ObjC başlığını oluşturmak için XCode IDE'de nerede bir şey yapmanız gerektiğini soruyor, çünkü mevcut bir ObjC projesine Swift kodu eklerken "varsayılan olarak" gerçekleşmiyor.
David Kristensen

5
@ Popeye katılmıyorum. Bu durumda, dosyaları düzenliyor ve komut satırından derliyorsanız, bu sorunu göremezsiniz. Söz konusu olan sizin adınıza performans gösteren (veya gerçekleştirmesi gereken) IDE'dir. Bu büyük olasılıkla kesinlikle bir IDE işlevi olan proje kurulumu ile ilgilidir
gaige

11
@Popeye Dokümanlardan (PDF) : Swift kodunu Objective-C'ye aktardığınızda , bu dosyaları Objective-C'ye göstermek için Xcode tarafından oluşturulan bir üstbilgi dosyasına güvenirsiniz . (Cesurca yüzüm, Apple'ın italikleri.) Bu, Xcode'un Swift ve Objective-C'yi birlikte kullanmanıza yardımcı olan bir özelliği hakkında açıkça bir soru ve her üç etiket de kesinlikle uygun.
Caleb

3
Gaige ve belgeler yardımıyla çözdüm. Etiketi sadece atmıyorum: Bu durumda, başlık dosyası XCode tarafından oluşturulmalı ve XCode tarafından görülebilir. Böylece hata vermedi.
David Kristensen

3
@Popeye Yanlış bir şey yok - teklifi doğrudan sayfa 46'dan kopyaladım. Aşağı yukarı aynı şeyi söyleyen benzer ama farklı bir pasaj buldunuz.
Caleb

Yanıtlar:


165

Şimdi çalışıyor.

  1. Proje olmayan bir ürün Modülü Adı olmalıdır değil boşluk.
  2. Tanımlama Modülü , Paketleme altındaki Derleme Ayarları'nda Evet olarak ayarlanmalıdır .

Sonunda çalışıyor. Herkese yardımları için teşekkürler :-)


64
In Build Settingsunder Packaging, benim Defines Moduleiçin ayarlanır Yesve ben oluşturulan Product Module Nameboşluksuz. "* -Swift.h" XCode 6 tarafından oluşturulmuyor. ???
Loozie

25
Ek bir not: İlk önce belirtilen özellikleri hedef düzeyde ayarlamaya çalıştım ve işe yaramadı, "* -Swift.h" dosyası oluşturulmadı. Proje düzeyinde ayarladığımda işe yaradı.
Marcin

22
Aynı sorunu yaşıyorum. Ben var Defines Moduleayarlı Yesproje ile hedef her ikisi için ve Product Module Namebirlikte, tanımlanmış boşluk , ama bu dosya hazırlanmayacağından gibi olamaz.
Craig Otis

8
Diğerlerinin benim kadar şaşkın olması durumunda ... Burada kör şansım olmalı ve başlığı otomatik olarak tamamlayamayacağı için içe aktarmalıydım.
shawnwall

14
Yalnızca uygulamada başlık dosyalarına (.h) -swift dosyasını aktaramazsınız.
zirinisp

122

Benzer bir sorunum vardı ve yalnızca ekleyebileceğiniz

#import "ProductModuleName-Swift.h"

şemsiye başlığının bulunması için .h dosyalarını değil obj-c .m dosyalarını


2
Bu doğrudur ve ... ya objc üstbilgisinde Swift sınıfı kullanmam gerekirse? İleri bildirimle denedim, işe yaramıyor.
Ixx

2
Whops, özür dilerim, ileri bildirim çalışıyor. Noktalı virgül eklemeyi unuttum: P
Ixx

14
Gelecekteki araştırmacılar için: başlıklarınızda, .h dosyalarınızın üstünde @class YourSwiftClass yaparak (şemsiye başlığını içe aktarmak yerine)
beyanı iletin

4
Başlık dosyasında Swift numaralandırma kullanmam gerekirse ne olur?
jakecraige

1
Ayrıca, "#import ProductModuleName-Swift.h" herhangi bir üstbilgi dosyasındaysa, ProductModuleName-Swift.h dosyası (Xcode 7.2'den itibaren) hiç oluşturulmayacak, böylece silinmişse (örn. ), dosyanın içe aktarıldığı her yerde, .m dosyaları için bile karışıklığa ekleyerek hata mesajları göreceksiniz.
rene

59

Dosyayı oluşturmadan önce tüm derleme hatalarını düzeltmem gerektiğini buldum .

Benim için sorun, bir tavuk / yumurta problemi olmasıydı, aslında #importifadeyi yorumlayana kadar herhangi bir yapı hatası görmedim :

//#import "ProductModuleName-Swift.h"

Swift kodumda bir sürü başka hatayı ortaya çıkardı.

Bu yeni hataları düzelttikten ve kaynak yapıyı başarıyla kazandıktan sonra, #import ve bingo ! Üstbilgi oluşturuldu ve doğru bir şekilde içe aktarıldı :)


Teşekkürler beni tam olarak tutan budur. Hızlı inşa hatalarını düzelttikten sonra gitmek için iyi oldu. (Xcode Sürüm 6.1.1)
Rick Roberts

10
Bu, Xcode'da "hatalardan sonra binaya devam et" ayarını açmak için harika bir noktadır.
Kendall Helmstetter Gelner

Bu da benim durumum: eksik -Swift-h, hızlı kaynak kodundaki aynı değişikliklerden sonra oldu
Giorgio Calzolato

3
tavuk / yumurta problemini gördükten sonra sorunumu anladım, İyi benzetme
d0ye

Bu sorun her zaman bana (Xcode10) dönüyordu ve ben sadece Xcode buggy olarak yorumladı. Bu
cevaptı

44

Benim gibiyseniz, büyük olasılıkla başlık adını yanlış anladınız. Bir süre başımı dayak ettikten sonra DerivedData dosyayı aradım ve orada olduğundan emin olun. Kurulumumda (standart türetilmiş veri klasörünü kullanarak, inanıyorum):

cd ~/Library/Developer/Xcode/DerivedData
find * -iname '*Swift.h'

Bulacak. Bu klasördeki hiçbir şey eşleşmezse, Xcode onu oluşturmaz.

Xcode Sürüm 6.2 (6C86e) kullanıyorum


Bu benim için yaptı. Otomatik tamamlamanın onu orada olmayacağını düşündüğümden alacağını düşünüyordum. Dizinde görmek işleri temizledi.
Will

Bazen görmek inanmaktır. Önerilen cevabı takip edene kadar bir şeyleri çalıştıramadım ve sonra bu adımları kullanarak, sürprizim, -Swift.hgerçek Swift dosyamın adı ile değil , sonradan düzeltildi . Teşekkür ederim!
Josh Habdas

Teşekkürler! Beni çok zamandan
kurtardı

43

Proje modülü adınızın içinde boşluklar varsa , , boşlukları bir alt çizgi ile değiştirmeniz .

Örneğin, proje adınız "Projem" ise, şunu kullanırsınız:

#import "My_Project-Swift.h"


12
Proje modülü adınızın içinde kısa çizgiler varsa, bunların alt çizgi ile de değiştirilmesi gerekir. Proje adınız "Benim Projem" ise #import "My_Project.h" kullanın
Jeff Ames

6
Ayrıca, proje modülü adınız bir sayı ile başlıyorsa, bunun yerine bir alt çizgiyle de değiştirilmelidir. "1. Proje" "_st_Project-Swift.h" olacak
Danation

31

* Tek önemli şey: *

tanımlanmış "Ürün Modülü Adı" nı hedefte ve ardından -Swift.h kullanmak için

#import <Product Module Name>-Swift.h

// in each ObjectiveC .m file having to use swift classes
// no matter in which swift files these classes sit.

"Modülü Tanımla" parametresi Evet veya Hayır olarak ayarlanmışsa veya "Ürün Modülü Adı" Projesi ayarlanmamışsa.

Hatırlatma: Swift sınıfları, ObjectiveC / Foundation'a maruz kalabilmek için NSObject'ten türetilmeli veya @objc özelliğiyle etiketlenmelidir || Kakao ...


1
Bu doğru: Projede veya Hedefte "Modül Tanımla" ya gerek yok
Giorgio Calzolato

25

Bununla ilgili bir sorun bulabilmeniz için bir neden daha eklemek istedim - Swift ve Objective-C kodunu karıştıran bir çerçeve oluşturuyordum. Swift sınıflarını çerçeve dışında alamadım - -Swift.h dosyasını kontrol ettim ve üretiliyordu ama boştu.

Sorun çok, çok basit çıktı - Swift sınıflarımın hiçbirini kamuya açıklamamıştım! Public anahtar sözcüğünü sınıflara ekler eklemez, bunları çerçevenin içindeki ve dışındaki sınıflardan kullanabildim.

Ayrıca, çerçeve içinde (yalnızca başka bir yanıttan bahsedildiği gibi .m dosyaları içinde) -Swift.h dosyasını aşağıdaki gibi içe aktarmak zorunda kaldım:

#import <FrameworkName/FrameworkName-Swift.h>

2
Framework'te ayrıca Swift sınıflarını kullanmak için NSObject'ten miras alınmaları gerektiğini (@objc bile yardımcı olmayacak) ve tüm yöntemlerin / özelliklerin herkese açık olması gerektiğini unutmayın.
dmitrynikolaev

3
En azından mevcut XCode 7 ön sürümünde, siz NSObject'ten miras alana kadar bunlar oluşturulan hızlı üstbilgide kullanılamaz.
dmitrynikolaev

% 100 sorunumu çözmedi. HER çözüm "sınıflarınızı halka açık". Bunu ben yaptım. Dönemi. Çerçeveyi kullanan projelerde Swift sınıflarını hala göstermiyor.
datWooWoo

@lespommes, bir soru yazmalı ve sorunu gösteren bir yere örnek bir proje hazırlamalısınız, biri neler olup bittiğini anlayabiliyordu ... Cevabımı olası bir çözüm olarak verdim, çünkü en çok yaptığım görünürlük hatası sık sık.
Kendall Helmstetter Gelner

2
Ah evet, ithalatla ilgili ipucun sonunda benim için hile yaptı! Çok teşekkürler!
endowzoner

14

Ben de aynı problemi yaşadım. İlk Swift dosyanızı eklemeden önce ayarları değiştirmeniz gerekir (Modül ve Ürün Modülü Adını Tanımlar) .

Daha sonra yaparsanız, başka Swift dosyaları ekleseniz veya Swift dosyasını silseniz ve yeni bir tane oluştursanız bile bu proje için "* -Swift.h" dosyası oluşturulmaz.


Bunun doğru olduğundan emin değilim. Birçok hızlı dosya oluşturduktan sonra 'Modül Tanımlar'ı etkinleştirmeye karar vermedim ve bir -Swift.h elde edebildim.
Michael Peterson

Aslında bunun yaşadığım problem olduğunu bildirmekten dolayı üzgünüm :( .swift'imi silmek ve tekrar eklemek zorunda kaldım ve hepsi işe yaradı.
StuFF mc

2
Şimdi ne olacak? Hem Swift hem de ObjC kodunu değiştirmenin ortasındayım. Project-Swift.h dosyam güncellenmiyor. Üstbilgi dosyasını bile silmeye çalıştım.
Suhail Bhat

2
Bunu yazmak zorunda kaldım, dev.iachieved.it/iachievedit/?p=980 . Swift dosyalarını eklemeden önce derleme ayarlarını güncelleme ipucu benim için çok önemliydi.
Joe

Bu, projeyi yeniden oluşturmam ve bunu yapmadıysam her şeyi yeniden eklemem gerektiği anlamına mı geliyor? Ne yaparsam yapayım * -Swift.h dosyası oluşturulamıyor gibi görünüyor.
kgreenek

13

Swift'i eski bir objc projesinde kullanmaya çalışırken deneyimlerimi paylaşmama izin ver. Ben ayarlamak zorunda değildi Defines moduleiçin YES.

Benim durumumda bir objc Bridging Header olduğundan emin olmalıydım. Yapım ayarlarımda yalnızca oluşturulan arayüz başlığı adı mevcuttu.

Köprü başlığı eksik

Bu, MyApp-Swift.h dosyasının oluşturulmasına neden olur, ancak Swift sınıflarımdan hiçbir iz kalmaz.

Apple belgeleri, ilk hızlı dosyanızı eklerken bir köprüleme başlığı oluşturmanız isteneceğini söylüyor. Ben değildim. Manuel olarak birMyApp-Bridging-header.h dosya ve "Objective-C Bridging Header" alanına işaret ettim. Bu, MyApp-Swift.h dosyamı Swift sınıflarımla doldurdu.

Dokümanlar: Swift'i Objective-C'ye Aktarma


Evet, her ne sebeple olursa olsun ObjC Swift.h dosyam sadece projeye boş köprüleme başlık dosyası ekledikten sonra Swift sınıf üstbilgileriyle oluşturuldu!
Andrew

Burada aynı. Boş bir Objective-C köprüleme üstbilgisi dosyası eklenene kadar Swift kodum oluşturulan * -Swift.h dosyasına alınmadı.
Nik

12

Burada, moduleName-Swift.h'nin oluşturulmayan başka bir varyasyonu var.

Projeme IOS Grafikleri dahil etmeye karar verdim ancak aynı dizindeki kaynakları karıştırmak istemedim, bu yüzden Charts Project klasörünü kodumun proje klasörünün yanına yerleştirdim. Grafikler projesini Projemin Gezinti Çubuğuna sürükledim ve çerçeveyi Genel proje ayarlarındaki proje hedefimin Gömülü İkililer listesine ekledim ve Yerleşik İçerik Hızlı Kodu İçeriyor anahtarını projemin Yapı Seçenekleri bölümündeki Yapı Ayarları sekmesine evet olarak ayarladım .

Projemin moduleName-Swift.h dosyası, burada önerilen diğer anahtarlar veya ayarlar ne olursa olsun hiçbir zaman üretilmez. Son olarak, Lou Z'nin -Swift.h dosyalarını arama yöntemini kullanarak, bir Charts-Swift.h dosyasının projemin Charts.framework / Headers / dizinindeki xcode Build dizininde oluşturulduğunu gördüm.

Projemin kaynak dizinine kod eklemeden Daniel Gindi'nin ios-çizelgeleri Swift paketini kullanmanın çözümü şunları eklemekti:

#import "Charts/Charts-Swift.h"

Projemin verilerini gösteren modüllere.


IOS listelerinde takım ipucunu değiştirmek / özelleştirmek mümkün müdür? evet ise bir örnek verebilir misiniz?
Amit Chauhan

12

Dosya adından önce Hedef adınız gelir. Ürün adı olarak adlandırılır, ancak pratikte hedef addır. Yani yeni bir hedef için inşa etmek istiyorsanız that_target-Swift.hdosya beklemeye hazır olun .

Bununla başa çıkmanın bir yolu

  1. Hedefinizin her biri için hedefinizin adı olan boşluklar olmadan bir önişlemci ekleyin. Ör. MY_TARGET=1. Bunu, hedeflerinizin her biri için Proje ayarları-> Derleme Ayarları-> Önişlemci Makrolarına ekleyin.
  2. PCH dosyası kullanıyorsanız,

Bu satırları PCH dosyasına ekleyin

#if MY_TARGET==1
#include "My_Target-Swift.h"
#elif THAT_TARGET==1
#include "That_Target-Swift.h" 
#endif

PCH dosyasını kullanmanın avantajı, her yere üstbilgileri eklemek zorunda olmamanızdır.

  1. PCH dosyası kullanmıyorsanız, aynı satırları tek bir başlığa ekleyin ve hızlı sınıfları kullanmanız gereken her yere bu başlığı ekleyin.

Bu gayet iyi çalışıyor.


Başlığı doğrudan kaynağınıza aktarmak için bu çözümü kullanmayı gerçekten seviyorum. Birden fazla hedef / proje tarafından aynı kaynak kodunun kullanıldığı karmaşık bir proje yapısına sahibim. Bu, tüm kodum üzerinde dağınık bir #if #else ifadesi eklemekten kaçınır. Cevap için teşekkürler!
Ryan

Bu benim günümü kurtardı. Kodun 5 satırını "Something-Swift-Headers.h" dosyasına ( includeiçinde) koydum . Sonra bu yeni dosyayı ihtiyacım olan yerden içe aktarıyorum. Döngüsel bağımlılıkları önlemek ve .m dosyalarında kolaylık başlığını kullanmak için bunu PCH veya herhangi bir .h dosyasının içine koymamayı tercih ederim.
ctietze

Bu pek çok düzeyde yanlıştır. İlk olarak, .pchdosyalar büyük ölçüde önerilmez . İkinci olarak, dosya adı Ürün adını içerir ve hedef adı DEĞİLDİR. Aynı olması bir tesadüf olabilir, ancak Ürün adını kullandı!
Iulian Onofrei

10

Xcode aslında -Swift.h başlığınızı oluşturuyorsa (DerivedData'nın derinliklerinde) ancak Swift sınıflarınıza başvurmuyorsa, tanımlanmış bir köprü üstbilgisine de sahip olduğunuzdan emin olun. Dokümanları okuduğumda, Swift'ten Objective-C'yi çağırmak için buna ihtiyacım vardı, ancak Swift'i Objective-C'den çağırmak için de gerekli görünüyor.

Cevabımı görün: https://stackoverflow.com/a/27972946/337392

DÜZENLEME: Sonunda Apple belgelerinde açıklandığı gibi genel ve dahili erişim değiştiricileri nedeniyle: -

Varsayılan olarak, oluşturulan başlık genel değiştiriciyle işaretlenmiş Swift bildirimleri için arabirimler içerir. Uygulama hedefinizde bir Objective-C köprü başlığı varsa, dahili değiştiriciyle işaretlenmiş olanları da içerir.


Evet, bu gerçekten yardımcı oldu. Bunu bilmiyordum. Ben sadece Swift kullanım durumundan Obj-C için gerekli olduğunu düşündüm.
nodepond

Memnuniyetle yardım ettim. Cevabı düzenledim çünkü o zamandan beri bu davranışın nedenini öğrendim.
Echelon

7

Burada birçok insanın varlığını sürdürmek, ancak uygun bir ekran görüntüsü eklemek. Swift ve Obj-C kodu kesinlikle birlikte yaşayabilir. Bu bir ya hep ya hiç oyunu değil.

Objective-C'nizdeki Swift dosyalarına erişmek için tek yapmanız gereken bu çağrıyı Obj-C dosyanıza eklemektir (.m / application dosyasında):

#import "{product_module_name}-Swift.h"

(Burada {product_module_name}, projenizin ürün modülü adını temsil eder). Ürün modülünüzün adını tahmin etmeye çalışmak ya da boşluk ve özel karakterleri olan köşe kutuları bulmaya çalışmak yerine, projedeki yapı ayarları sekmesine gidin ve "ürün modülü adı" yazın - müfettiş sizinkini size gösterecektir. Benim olmasını beklemediğim bir şeydi. Kafanız karıştıysa bu ekran görüntüsüne göz atın.

resim açıklamasını buraya girin

Ve Obj-c kodunun Swift'te çalışmasını sağlamak için, bir köprüleme başlık dosyası eklemeniz ve ilgili Obj-C başlıklarını oraya aktarmanız yeterlidir.


1
Olmamalı mı #import?
Iulian Onofrei

Diyelim ki proje adım ABC, o zaman projemde "ABC-Swift.h" olmalı, değil mi? Onu bulamıyorum. Manuel olarak oluşturmanız mı gerekiyor? Kendimde herhangi bir hızlı dosya oluşturmuyorum, sadece hızlı yazılmış bir kakao kapsülü dahil.
nr5

Köprüleme Başlığı (sizin durumunuzda ABC-Swift.h) otomatik olarak oluşturulmaz. Bir Obj-C projesinde ilk Swift dosyanızı oluşturmaya çalıştığınızda, Xcode normalde bir tane eklemenizi ister. Ayrıca burada gösterildiği gibi kendi başınıza bir Köprüleme başlığı da oluşturabilirsiniz ('köprüleme başlığı' için control + f): developer.apple.com/library/content/documentation/Swift/…
Brian Sachetta

5

En önemli şey bu dosya görünmez olmasıdır !!! En azından Xcode6 beta5'te. Çalışma alanınızda "YourModule-Swift.h" adlı böyle bir dosya olmayacak. Modül adınızın olduğundan ve modülün yes olarak ayarlandığından emin olun ve bunu Objective-C sınıfınızda kullanın.


5

Tamam, gerçekten ihtiyacınız olan her şey burada!

Eklediğiniz tüm hızlı dosyaları kaldırın ve kodu hatasız derleyin.

----------

resim açıklamasını buraya girin

----------

2. "Projeler" oluşturma ayarlarına gidin ve ürün modülü adını ayarlayın. Projede boşluk içermeyen bir Ürün Modülü Adı olmalıdır.

----------

resim açıklamasını buraya girin

----------

3.Defines Modülü, Build Settings'de, Packaging altında, projenizde Yes olarak ayarlanmalı ve hedeflenmemelidir!

----------

resim açıklamasını buraya girin

----------

Şimdi, dosya-> newFile-> dosyasında hızlı bir dosya veya görünüm denetleyicisi oluşturun

----------

resim açıklamasını buraya girin

----------

Bir köprüleme başlığı oluşturmayı, bir tane oluşturmasına izin vermeyi isteyecektir. Bir kez reddettiyseniz, manuel olarak bir -Bridging-Header.h eklemeniz gerekir.

Derleyiciye ObjectiveC'ye maruz kalması gereken hızlı bir dosya olduğunu söylemek için @objc'yi denetleyiciye ekleyin

----------

resim açıklamasını buraya girin

----------

6.Projeyi inşa edin ve objektif kontrolörün herhangi birinde #import "-Swift.h" dosyasını içe aktarın ve işe yarayacak! Gerçek dosyayı görmek için Komut tuşuna tıklayabilirsiniz!

----------

resim açıklamasını buraya girin

----------

Bu yardımcı olur umarım!


>> Gerçek dosyayı görmek için Command tuşunu tıklatabilirsiniz! Bu havalı
Jagan

4

Bu yanıt, Swift sınıflarını çağıran bazı Objective-C kodlarına sahip olabileceğiniz ve bu hatayı almaya başladığınız kullanım durumunu ele alır.

Sorun Nasıl Onarılır

Aşağıdaki adımlar benim için tüm sorunları çözdü. Yukarıda "tavuk ve yumurta" dan bahseden birini okudum ve tam da beni bu prosedüre götüren kavram. Bu açık işlem, başlık sınıfına kadar Swift sınıflarını referans alan herhangi bir Objective-C kodunu kaldırmak zorunda olduğunu gösterir.

  1. Objective-C uygulama dosyanızdaki #import "ProductModuleName-Swift.h" deyimini yorumlayın
  2. Swift Sınıfları için Objective-C uygulama dosyasındaki tüm referansları yorumlayın
  3. Temizle ve Oluştur
  4. Tüm hataları / uyarıları çözme
  5. #İmport "ProductModuleName-Swift.h" deyimindeki yorumu kaldırın
  6. Temizleyin ve derleyin (kalan hataları başarılı bir şekilde düzeltin veya bu noktada Objective-C'de herhangi bir Swift sınıfına başvurmadığınızı doğrulayın . Öyleyse bunları geçici olarak yorumlayın)
  7. "ProductModuleName-Swift.h" ifadesinin #import "ProductModuleName-Swift.h" ifadesinin sınıf adına Cmd-Clicking ile oluşturulduğunu doğrulayın
  8. Objective-C uygulama dosyasındaki Swift sınıflarına başvuran koddaki yorumu kaldırın.
  9. Clean & Build normal olarak ("ProductModuleName-Swift.h" oluşturulmalı ve Swift Class'ları referans alan Objective-C kodunuz normal olarak kullanılabilir)

Nota Bene: Yukarıda belirtildiği gibi alt çizgilere ve Tanımlar Modülünü EVET olarak değiştirmeyle ilgili yanıtlar, Apple Belgeleri'nde belirtilen kurallar gibi bu işlemi gerçekleştirirken de geçerlidir .

Köprüleme Üstbilgisi Yolu

Bir hatada, oluşturma işlemi sırasında ProductModuleName-Bridging-Header.h dosyası bulunamadı. Bu gerçek bir hata oluşturdu

<bilinmiyor>: 0: hata: '/Users/Shared/Working/abc/abc-Bridging-Header.h' köprüleme başlığı mevcut değil

Hatanın daha yakından incelenmesi, dosyanın gerçekte konumunda olduğu için hiçbir zaman açıklanan konumda bulunmayacağını gösterdi ( yanlış bir yol )

'/Users/Shared/Working/abc/abc/abc-Bridging-Header.h'. düzeltmeyi elle yapmak için hedef / proje oluşturma ayarlarını hızlı bir şekilde aramak ve abc-Swift.h dosyası yeniden otomatik olarak oluşturuldu.

birikmesi ayarları


1
Projeniz o kadar büyükse, hızlı kodun tüm referanslarını objektif c'de yorumlamak pratik olmazsa ne olur?
Andrew Morris

3

Objective-C sınıflarında bir başlık almanız gerekir:

#import “ProductModuleName-Swift.h”

Otomatik olarak oluşturulur, referansta "Hedefinizdeki herhangi bir Swift dosyası, bu içe aktarma ifadesini içeren Objective-C .m dosyalarında görünür olacaktır."


24
Ancak, bunu yaptığımda, bir derleme hatası alıyorum, AppName-Swift.h mevcut değil. Oysa AppName-Bridging-Header.h mevcut.
David Kristensen

5
@DavidKristensen: Çözdünüz mü ?, aynı sorunla karşılaştığım gibi
BaSha

2

Projede gerçek bir dosya oluşturulmadı ([ProductModuleName] -Swift.h). Cmd + İçe aktarma üzerine tıklayın ya anında (ve bellekte) oluşturur, böylece bağlantının nasıl yapıldığını görebilirsiniz ya da bazı Xcode önbellek dizininde bir yerde bir dosya açar, ancak proje dizininde değil.

Modül Tanımlama proje desteğini (hedefin Oluşturma Ayarlarında) Evet olarak ayarlamanız gerekir ve modül adınızda boşluk veya tire varsa - [ProductModuleName] -Swift.h dosyasının tüm içe aktarmalarında _ öğesini kullanın.

Hızlı türler kullandığınız tüm .h ve .m dosyalarına veya .pch dosyasına aktarabilirsiniz.

Modülüm (projem) "Test Projesi" olarak adlandırılmışsa, projemin .pch dosyasında (sadece orada) şu şekilde içe aktarırdım:

#import "Test_Project-Swift.h"

2

Sadece "." orada proje adı. Xcode, "." köprüleme üstbilgisi dosyasının Swift sürümü için alt çizgi "_" ile. Garip bir şekilde oluşturulan Bridging-Header.h, noktaların alt çizgi ile değiştirilmez.

Örneğin, My.Project adında bir projede aşağıdaki Köprüleme Başlığı dosya adları bulunur.

Bridging-Header.h (Otomatik olarak oluşturuldu)

My.Project-Köprü Oluşturma-Header.h

Swift.h

My_Project.h

Umarım bu bir dönem kullanan ve benim gibi sıkışmış herkese yardımcı olur. Bu dosya aşağıdaki konumda bulunabilir.

Macintosh HD / Kullanıcılar / kullanıcı / Kütüphane / Developer / Xcode / DerivedData / My.Project-fntdulwpbhbbzdbyrkhanemcrfil / Build / Intermediates / My.Project.build / Debug-iphonesimulator / My.Project.build / DerivedSources

Kendine iyi bak,

Jon


2

Projede boşluk içermeyen bir Modül Adı olmalıdır. Tanımlama Modülü, Paketleme altında Derleme Ayarları'nda Evet olarak ayarlanmalıdır. #import ifadesini yorumladı:

"ProductModuleName-Swift.h" dosyasını içe aktarma konusunda hala hatayla karşılaşıyorsanız

// # import "ProductModuleName-Swift.h"

Swift kodumda bir sürü başka hatayı ortaya çıkardı.

Bir kez bu yeni hataları düzelttikten ve kaynak binayı başarıyla aldım, #import ve bingo'yu uncommented ettik! Üstbilgi oluşturuldu ve doğru bir şekilde içe aktarıldı :)


Benim sorunum Swift kodumda da hatalar vardı, ama -Swift.h dosyasını uncommented kadar bilmiyordum. Teşekkürler!
Will

1

Her zaman üzerimde çalışan bir numara buldum.

  1. #İmport "ProductModuleName-Swift.h" dosyanızı appDelegate.h dosyanızda ve ProductName-Prefix.pch dosyanızda oluşturun. Xcode 6'da yoksa, bu şekilde oluşturabilirsiniz Neden ProjectName-Prefix.pch Xcode 6'da otomatik olarak oluşturulmuyor?
  2. Komut + üst karakter + k kodunuzu temizlemek için "ProductModuleName-Swift.h" dosyanızla ilgili bir hata alırsanız appDelegate.h dosyasından silin.
  3. Kodunuzu tekrar temizleyin. Şimdi her şey bir cazibe gibi çalışacak
  4. "ProductModuleName-Swift.h" hakkında tekrar hata alırsanız, şimdi appDelegate.h dosyasında tekrar oluşturun ve kodunuzu tekrar temizleyin.

Bu hatayı her susturduğunuzda bu işi yapın (appDelegate.h dosyasından "ProductModuleName-Swift.h dosyasını silin ve oluşturun ve kodunuzu temizleyin).


1

Bu çözümü buldum

  • SwiftBridge.h oluştur
  • #import “ProductModuleName-Swift.h” yazın
  • Bu .h dosyasını genel yap (önemli) Dosyayı seçin -> In Dosyayı göster Denetçi (sağ çubuk) -> Herkese açık yap

Şimdi yapabilirsin

#import "SwiftBridge.h"

ProductModuleName-Swift.h yerine

Bu geçici bir çözüm, Xcode'un sonraki sürümü için bu sorunun çözüleceğini düşünüyorum. İyi şanslar


Çalışmıyor. Sadece denedim. Satır #import “ProductModuleName-Swift.h”sadece orijinal Objective-C kod dosyası yerine SwiftBridge.h dosyasında bir hata ile gelir.
Supertecnoboff

1

Modül adımı / objektif-c'nin swift başlıklarını içe aktarmasını belirlemekte zorlanıyordum. Burada da birçok makale okudum.

Ancak, proje adınız için dahil edilen tüm özel karakterlerle ('.' Veya sayısal veya boşluk olsun) kesin cevabı - sizin için çalışacak metni hedefin Oluşturma Ayarları altındaki " Ürün Modülü Adı " nda bulabilirsiniz. .

Örneğin, hedef adım sayısal bir "1mg" ile başladı ve yukarıda belirtilen alan modül adım olarak "_mg" gösterdi.

bu yüzden #import "_mg-Swift.h" kullandım ve işe yaradı.

Hedefin yapı ayarlarındaki Ürün Modülü Adı, projeniz için çalışacak doğru modül adını verir


Bir ekran görüntüsünün bağlantısını düzenleyebilirseniz, yanıtınızı sizin için görüntülemek üzere düzenleyebilirim.
SuperBiasedMan

1

Benim durumumda, dağıtım hedefini en az “OS X 10.9” olarak ayarlamak zorunda kaldım ve -Swift.hbaşlık otomatik olarak oluşturuldu. Dağıtım hedefi sürümünü değiştirdiğinizde, özellikle de daha eski ve çok büyük bir Objective C kodu tabanınız olduğunda, birçok kullanımdan kaldırma uyarısı alabileceğinizi unutmayın. Bizim durumumuzda da XIB dosyalarında ve görünüm sınıflarında yapacak çok işimiz vardı.


2
Diğerleri için - hedefinizin Oluşturma Ayarlarına bakın, tam adı "MyProject-Swift.h" olsun - uygun Objc dosyalarına "#include" MyProject-Swift.h "olarak eklemeniz gerekir. BTW, this cevap gerçekten bana yardımcı oldu - bazı eski ObjectiveC açık kaynak dönüştürmek için çalışıyor
David H

0

Daha önce “ProductModuleName-Swift.h” not foundhata ile ilgili herhangi bir sorun olmadan bir proje inşa edebildiyseniz ve şimdi bu kötü hataları tekrar alıyorsanız, neden son değişikliklerinizde oturabilir.

Benim için bu (yanlışlıkla) yanlış .swiftdosya kodlaması ile oldu. Değişiklikleri geri almak ve geri manuel getirmek işi yapar.


0

Bu açık bir nokta olabilir (belki çok açık olabilir), ancak üstbilginin oluşturması için projede en az bir hızlı dosyanız olmalıdır. Daha sonra hızlı bir şekilde yazmak amacıyla kazan plakası veya yapılandırma kodu yazıyorsanız, içe aktarma çalışmaz.


0

Objective C projemden WatchOS2 hızlı kodunu silmek zorunda kaldım. Ve ancak bundan sonra XCode -Swift.h oluşturmayı teklif etti


0

Ben benzer bir sorun vardı ama benim proje önce derleme ve birkaç dosya kodu değişikliği sonra aniden hata var. Myproject-swift.h dosyası için neden 'Dosya bulunamadı' hatası alıyorum. Yaptığım kod değişiklikleri bazı hatalar vardı. Xcode bu hatayı her zaman 'Dosya bulunamadı hatası'nı gösteren bir noktaya koymadı. Sonra önceki sürüm kodunun kopyasını aldım ve yeni kodla karşılaştırdım ve dosyayı tek tek birleştirdim. Her dosya birleştirme sonra hatayı bulmak için projeye uydu. Alt satırda kodunuzda hata varsa Xcode sadece benimproject-swift.h dosyası için 'dosya bulunamadı hatası' görüntüleyebilir. Büyük olasılıkla projenizde derleme hatası var. Bu hatayı temizleyin ve işe yarayacaktır.


0

Cocoapods gibi bir şey kullanıyorsanız (ve proje yerine çalışma alanı dışında çalışıyorsanız), çalışma alanını açmadan ve inşa etmeden önce projeyi açmayı ve oluşturmayı deneyin. YMMV.


0

Bazen obj-c .m dosyasındaki hedef üyeliğin ayarını kaldırıp yeniden ayarlamanız gerekir.

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.