Project-Swift.h bir Objective-C sınıfına aktarılıyor… dosyası bulunamadı


130

Objective-C'de başlatılan bir projem var ve daha önce Objective-C'yi yazdığım sınıf dosyalarına bazı Swift kodlarını aktarmaya çalışıyorum.

Swift ve Objective-C'yi aynı projede kullanma konusunda Apple dokümanlarına ve bunun gibi SO sorusuna danıştım , ancak yine de işe yaramıyor: koyduktan sonra dosya bulunamadı hatası almaya devam ediyorum #import "NewTestApp-Swift.h"( NewTestAppÜrünün adı ve modül).

İşte şimdiye kadar yaptıklarım:

  1. İçinde Define Modules, YESuygulama için seçildi .
  2. Ürün Modülü adının içinde boşluk olmadığından emin olun (aşağıdaki soruya bakın)

Ben kullanarak denedi #import "NewTestApp-Swift.h"içini ViewController.m, ViewController.hve AppDelegate.mancak bunların hiçbiri çalıştı.

Yanlış olarak başka ne yapıyorum? Yardımınız için teşekkürler.


Ayarların ekran görüntüsü:

görüntü açıklamasını buraya girin


Şu anda karşılaştığım hatalar:

görüntü açıklamasını buraya girin


3
Tüm Türetilmiş Verileri sil ~/Library/Developer/Xcode/DerivedData, benim için hile yaptı.
wzhang84

Sorunu
çözdüm

Yanıtlar:


158

Aynı sorunla karşılaşıyordum ve projemin hızlı bir şekilde obj-c sınıflarına aktarılmasını sağlayamadım. Xcode 6 kullanarak, (Xcode 6+ için çalışmalı) ve bunu bu şekilde yapabildim ...

  1. .H dosyasında erişmeniz gereken herhangi bir sınıfın böyle bir ileri bildirim olması gerekir

@class MySwiftClass;

  1. YALNIZCA .m dosyasında, kod aynı projede (modül) ise, o zaman kodu ile içe aktarmanız gerekir.

#import "ProductModuleName-Swift.h"

Bununla ilgili Apple belgelerine bağlantı

https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/importing_swift_into_objective-c


3
Cevap için teşekkürler. Bu beni doğru yöne götürdü. Aynı sorunu yaşadım, ancak bir protokolle, başlık dosyama içe aktarma yerine @protocol MySwiftProtocol eklemem gerekiyordu.
palme

.h dosyasında .h dosyasını yüklemeden sınıfın ileri beyanı benim için hile yaptı. Teşekkürler
Sikander

1
Ürün adınızın içinde bir -karakter varsa, oluşturulan başlık dosyasının adının o karaktere dönüştürüleceğini unutmayın _. Örneğin, ürün adınız ise My-App, ithal edersiniz My_App-Swift.h.
dvanoni

1
Oluşturulan doğru başlık dosyası adını bulmanın yeni bir yolunu buldum: hedefinize gidin -> Yapı Ayarları -> Anahtar kelimeleri araObjective-C Generated Interface Header Name , tombala!
Itachi

2
Bunların ikisini de yaptım ve hala aynı sorunu görüyorum. Siparişle bir ilgisi olduğunu düşünüyor musun?
ArielSD

83

Swift kodu bir Modülün içindeyse (sizin durumunuzdaki gibi):

#import <ProductName/ProductModuleName-Swift.h>

Swift kodu projenin içindeyse (karışık Swift ve ObjC):

#import <ProductModuleName-Swift.h>

Sizin durumunuzda, bu satırı * .m dosyasına eklemelisiniz:

#import <NewTestApp/NewTestApp-Swift.h>

ÖNEMLİ: ithalat ifadesindeki "<" işaretine bakın

https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html


@ İkocel1 yanıtladığınız için teşekkürler. Maalesef bunlar işe yaramadı. Ben varyasyonları denedim <NewTestApp-Swift/NewTestApp-Swift.h>, <NewTestApp/NewTestApp-Swift.h>ve <NewTestApp/ViewController-Swift.h>tüm iç ViewController.m, ancak rağmen, hata "dosyası bulunamadı" almaya devam Cleaningkombinasyonu denendikten sonra projenin her seferinde. Yardımcı olması durumunda sorunun gövdesine bir ekran görüntüsü ekledim.
daspianist

Henüz içine herhangi bir Swift kodu girmedim ViewController.m. Swift kodunu kabul etmesini sağlamak için sadece başlıkları içe aktarmaya çalışıyordum. İçinde Objective-C ve Swift kodunu karıştırıp eşleştireceğim ViewController.m.
daspianist

1
Doğrudan objc kodu ile swift kodunu aynı dosyada karıştırmanın mümkün olup olmadığını bilmiyorum.
ikocel1

1
Teşekkürler, sanırım bu, Apple'ın "Karıştır ve Eşleştir" belgesine dayandığım varsayımıydı .. ama sanırım gerçek dosyanın içinde değil. Teşekkür ederim!
daspianist

6
Bu cevabın neden onaylandığını anlamadım. Evet, belgelere uymak doğru ama pratikte benim için de çalışmıyor. Soru içinde bile, kullanıcının bu cevapta tavsiye edildiği gibi sözdizimini kullandığı ancak yine de bir hata aldığı açıktır.
Darius Miliauskas

54

Swift'i hedef-c'ye nasıl aktarmayı başardım:

  • Modülü EVET olarak tanımlar (projede - hedefte değil)
  • Ürün Modülü Adı ayarlandı (hedefte - projede değil)
  • ViewController.m'nizde swift kodunu şununla içe aktarın:

    #import "MyProductModuleName-Swift.h"
  • Object-c projenize (Dosya -> Yeni -> Swift) hızlı bir dosya ekleyin ve Xcode, amaç-c'den Swift'e köprüleme başlığını oluşturacaktır, ancak bu, görünüşe göre bunun tersi şekilde çalışmasını sağlamak için çok önemlidir .

Bu bulmacanın son parçası için, Swiftoverload sayesinde, Xcode GUI aracılığıyla bir Swift dosyası eklemeyi ve sadece çalışmasını sağlamak için mevcut hızlı dosyaları projeme sürükleyip bırakmakla kalmamamı sağladığı için Swiftoverload'a teşekkürler: http://nikolakirev.com/blog / kullanarak-hızlı-in-amaç-c-proje


Harika notlar. Test hedefinin kendi modülü olduğunu ve "<#TestTargetName #> - Swift.h" adlı kendi başlığına sahip olacağını ve hedef adlarındaki boşlukların boşluklara dönüştürüleceğini ekleyeceğim.
Chuck Krutsinger

@ holm51 bunu sorduğum için üzgünüm, ama nerede Define Moduleve Product Module Name?
matchifang

tire -adına çizgi dönüştürülecektir _yanı
CyberMew

11

Xcode 8.2.1'i kullanarak ve Proje > Oluşturma Ayarları> Objective-C Tarafından Oluşturulan Arayüz Üstbilgi Adı'na bakarsanız , burada Ürün gibi yalnızca bir başlık dosyası gösterilir. Name'e bakarsanız -Swift.h gösterilir.

Bu, her bir modülü Objective-C .m dosyasından ayrı olarak, tek tek -Swift.h dosyasını kullanarak içe aktarmak yerine, yalnızca bir Ürünü içe aktarmanız anlamına gelir. tüm Swift modüllerini bir araya getiren -Swift.h aktarmanız anlamına gelir.

Modülleri ayrı ayrı içe aktarmanın geleneksel yolunu arayarak aynı sorunla karşılaştım, ancak Xcode ve Swift 3'ün mevcut sürümü, tüm modül içe aktarımı için yalnızca bir başlık kullanacak şekilde değiştirdi.


merhaba peter, bu dosyayı nerede bulabilirsin? Yoksa xcode tarafından otomatik olarak mı oluşturuldu? Ayrıca, bu değişiklik nedeniyle pod dosyanızı farklı şekilde kurmanız gerekiyor mu?
Rob Norback

@RobNorback Yanılmıyorsam, Obj-C başlık / uygulama dosyasına 'import "Product-Swift.h" yazarak fazladan bir şey yapmadan etkiyi görebilirsiniz. Proje ayarlarınızın Swift ve Obj-C miksajı için her konfigürasyonun etkinleştirildiğinden emin olun. Ayrıca, Podfile ile ilgili bir sorun yaşamadım. Bir şeyleri farklı görüyorsam lütfen bana bildirin.
petershine

Teşekkürler, bu hatayı gidermek için saatler harcadım ve sorun aslında projemdeki modüllerin her birinin kendi -Swift.hbaşlık dosyasını oluşturmasıydı. Hepsini ortak bir başlık dosyası kullanmaya zorlamak (5 hedefim var) benim için sorunu çözdü.
Apoorv Khatreja

@ApoorvKhatreja onları bunu yapmaya nasıl zorladın? Dosya adını açıkça mı yazdınız?
Amit Raz

8

Bu sorun için bir saat harcadık, aşağıdaki adımları izleyerek neyin eksik olduğunu anlamanıza yardımcı olacaktır:

  1. Xcode tercihini açın ve DerivedData klasörüne gidin
  2. Finder'da "swift.h" araması yapın
  3. Herhangi bir proje-swift.h dosyası bulamazsanız, bu dosya oluşturulmamıştır. Genellikle swift sınıfınızdan birine @objc eklemeniz ve uygulamayı başarıyla oluşturmanız gerekir, ancak o zaman Xcode bu dosyayı oluşturacaktır.
  4. "Xxx-swift.h" dosyasını bulduysanız, içe aktarma ifadenizin doğru adı içerdiğinden emin olun.

nasıl yapılır-hızlı-dosyasını bulun


Lütfen aynı cevabı birden fazla soruya eklemeyin . En iyisini cevaplayın ve yeterince itibar kazandıktan sonra geri kalanını kopya olarak işaretleyin. Yinelenmemişse, gönderiyi soruya uygun hale getirin ve silme işlemi için işaretleyin.
Bhargav Rao

Bunun için teşekkür ederim! Uygulamamın ekran adını değiştirdim (hedefin adını değil) ve Swift başlığı da adını değiştirdi. Neler olduğunu bulabilmemin tek yolu buydu.
Lucas P.

Cevap gönderdiğiniz için teşekkürler. Ekran görüntüleri ve kesin nokta formu hemen beni geri kaydırmamı sağlıyor + baktım + aramamı bitirdi ... sorun çözüldü!
dklt

6

Swift'i bir Objective-C projesine aktarırken sorunlar yaşıyordum. Sonunda, Xcode 7'nin ne ürettiğini kontrol etmek için Derivied Data klasörüne baktım. Dosya adı beklediğimden tamamen farklıydı.

Gerçek dosya adını aldığımda, onu içe aktardım ve proje oluşturabilirdi.


2
Bu dosya nerede bulunur? Oraya baktım ve hiçbir şey bulamadım
Amit Raz

5

-Swift.hSwift kodu @objcveya [Hakkında] aracılığıyla bir API ifşa ederse Xcode tarafından otomatik olarak oluşturulmalıdır@objcMembers

Genellikle bir konum şuna benzer:

~/Library/Developer/Xcode/DerivedData/
  ProductModuleName-foo/
    Build/
      Intermediates.noindex/
        ProductModuleName.build/
          Debug-iphoneos/
            ProductModuleName.build/
              DerivedSources/
                ProductModuleName-Swift.h

Tarafından değiştirilebilir

Project editor -> select a target -> Build Settings -> Per-configuration Intermediate Build Files Path

Varsayılan olarak değer $(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)


2

DEFINE MODULES: EVET ve Obj-C sınıfının .m dosyasında "ProjectName-Swift.h" dosyasını içe aktarın

Bu, Obj-c'deki Swift sınıflarına erişmem için çalıştı.


3
Ancak objc başlığında swift sınıfına ihtiyacım olursa .h dosyasına nasıl aktarırım?
Alexander Danilov

1

Git kullanarak proje üzerinde çalışırken ekibimle aynı problemle karşılaşmıştım. Bir geliştirici, Xcode'u en son Swift 2.2 sürümü için gerekli olan son sürüme (7.3) güncellemedi. Dolayısıyla, derleyici yeni Swift sözdizimini tanımadı ve Swift kitaplığı (projeadı-swift.h) için arabirim oluşturamadı. Xcode sürümünün en son sürüm olup olmadığını kontrol edin!


Benim durumumda sorunla karşılaştım çünkü Xcode tarafından sunulan Swift 3'e geçişi ertelemeye karar verdim. Sonuç olarak Xcode, Swift kaynak dosyalarını oluşturamadı ve dahil edilecek başlıkları oluşturmadı.
iutinvg

1

Geliştirme sırasında, bazı sözdizimi hataları olabileceğinden tam olarak uygulanmayan herhangi bir swift sınıfına sahip olma ihtimaliniz olabilir. Swift başlık dosyası, yalnızca tüm swift dosyaları hatasız ise kullanılabilir.

Swift dosyalarında sözdizimi hatası olmadığından emin olun ve ardından swift başlığını objektif - c dosyasına aktarmayı deneyin.


1

Başlık dosyasını içe aktarma, yani

#import "<ProjectName>-Swift.h" 

.h dosyası içinde şunu belirten bir hata oluşturdu:

-Swift.h 'dosyası bulunamadı

ve yapı başarısız oldu.

Bunun yerine şunu kullanın:

#import "<ProjectName>-Swift.h"

.m dosyası içinde ve aynı hata görünse bile, projeyi yine de çalıştırmak hatayı bastırır.

Swift sınıfları daha sonra .m dosyasında bulunur.


1

Sorunla proje (hedef) adıyla karşılaştım. "-" sembolü içeriyordu. Yani sonraki karar şuydu: projenin adı "Test-App" ise, içe aktarılan sınıfın adı "Test_App-Swift.h" olur


mükemmel çözüm
iOS Lifee

1

Uygulamanızın adında herhangi bir özel karakter varsa, özel karakter için _ kullanın.

Örneğin, Uygulamanızın adı "Test Uygulaması®" ise

Daha sonra "Test_App_-Swift.h" ile swift dosyasını içe aktarabilirsiniz.

Boşluk ve ®, siz içe aktarırken _ ile değiştirilir.


0

Birden fazla hedefiniz varsa, tüm çerçeveleri oluşturduğunuzdan emin olun


0

Xcode 11

Xcode 11 üzerinde derleme yaparken bu problemle karşılaştım. Neyin yanlış olduğunu anlamam biraz zaman aldı, ama esasen, Info.plistdosyada doğrudan değişiklik yapmak yerine Hedefin "Genel" sekmesindeki "Görünen Ad" ayarını değiştirdim . Hedefte "Bilgi" sekmesi.

Bu, Xcode 11.5'in bir dizi yepyeni özel yapı ayarının yeniden yazılması / oluşturulması ve uygulama modülünün ve yerleşik .app ürününün adının değiştirilmesiyle sonuçlandı. Bu durumda yeni görüntü adı aynı zamanda bir eğik çizgi (vardı /o (bkz bina değildi neden sonuçta olabilir onun içinde) karakterini @Silversky Teknoloji 'ın cevabı ).

Ne olursa olsun, Xcode 11.5'in proje dosyasındaki tüm otomatik değişikliklerini geri alarak ve dosyadaki paket görünen adında aynı değişikliği manuel olarak yaparak bu sorunu çözdüm Info.plistve her şey mükemmel çalışıyor.

Keşke size böyle şeyler yaptığını söylese ve bunu sizin rızanız olmadan yapsa.


0

Swift sınıfınızın genel bildirime sahip olduğundan ve NSObject'i genişlettiğinden emin olun:

public class MySwiftClass: NSObject {
    //...
}

Swift sınıfı aynı projedeyse, içe aktarma parantezlerle değil tırnak işaretleriyle çalışmalıdır.


0

Önce bir Swift Dosyası eklerseniz, sol sütunda hedefinize hızlı dosya eklemeyi unutmayın ...

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.