Xcode 6 / Beta 4: menggunakan menjembatani header dengan target kerangka kerja tidak didukung

131

Saya baru saja memutakhirkan ke Xcode 6 Beta 4 dan memiliki kerangka kerja yang saya buat untuk Live Views dalam Beta 2. Karena bug cepat lainnya , saya perlu menggunakan beberapa kode Obj-C. Ketika memutakhirkan, saya mendapatkan kesalahan berikut:

galat: menggunakan header penghubung dengan target kerangka kerja tidak didukung

Saya belum melihat apa pun di catatan rilis, atau menemukan jalur migrasi lainnya. Adakah orang lain yang melihat ini dan sampai pada solusi?

Saya menyadari bahwa Beta 3 menghilangkan kebutuhan kerangka kerja untuk tampilan langsung, tetapi masuk akal dalam kasus saya jika saya bisa membuatnya bekerja. Saya dapat menghapusnya sebagai fallback, tetapi lebih suka menggunakan framework jika mereka tidak sepenuhnya rusak di Beta 4.

Chris Conover
sumber
"Saya menyadari bahwa Beta 3 menghilangkan kebutuhan akan kerangka kerja". Bagaimana?
hnh
2
(untuk tayangan langsung) - diedit
Chris Conover
1
Saya mengalami masalah yang sama.
Simon Germain
2
Wow, suntingan kecil Anda di sana hanya membuat hidup saya jauh lebih baik - tidak mendengar perubahan ini (menghilangkan kebutuhan akan kerangka kerja) di mana pun dan membenturkan kepala saya dengan semua target kerangka kerja ini untuk tampilan langsung selama berjam-jam. Terima kasih banyak atas @chrisco ini!
yonix

Jawaban:

232

Saat status kesalahan, menjembatani header tidak diperbolehkan dalam Kerangka. The Mengimpor Kode dari Dalam Rangka Sasaran Sama bagian dari Mix & Match petunjuk dokumentasi apel di ini. Seperti yang mereka katakan, Anda perlu "Dalam file header payung Anda, impor setiap header Objective-C yang ingin Anda paparkan ke Swift".

Namun, saya menemukan bahwa Anda mungkin juga perlu membuat tajuk khusus tersebut untuk publik. Jawaban ini mengulas mengapa dan bagaimana melakukannya: Kesalahan kompiler Swift: "header non-modular di dalam modul kerangka kerja" .

Jadi, lakukan ini:

  1. Hapus file header bridging Anda.
  2. Hapus referensi ke file header bridging di pengaturan build untuk framework
  3. Tambahkan header yang diperlukan ke file payung Anda ([ProductName] .h)
  4. Jadikan file yang disertakan untuk umum di bagian "Header" kerangka kerja dari "Build Phases" -nya.
  5. Bersihkan dan bangun kembali.

Catatan : "payung file header" adalah file (bernama [ProductName] .h) yang umumnya mewakili semua header publik dari suatu kerangka kerja. Biasanya hanya daftar pernyataan impor ke header lain yang terkandung dalam kerangka kerja. Di Xcode, jika Anda membuka UIKit.h, Anda akan melihat contoh yang baik dari file payung.

DeepFriedTwinkie
sumber
3
Terima kasih atas jawaban singkatnya (ditandai seperti itu). Saya telah membaca bagian itu tetapi bingung tentang perbedaan antara Umbrella dan Bridging header.
Chris Conover
1
@ zaxy78 lihat bagian "Mengimpor Swift ke Objective-C" dari dokumen ini: developer.apple.com/library/ios/documentation/Swift/Conceptual/…
DeepFriedTwinkie
4
@DeepFriedTwinkie, file payung apa yang Anda maksud ketika Anda mengatakan: "Tambahkan header yang diperlukan ke file payung Anda"? Terima kasih.
Allan Macatingrao
2
Inilah yang saya butuhkan. Menambahkannya ke bagian publik adalah perbaikannya.
olivaresF
20
Apakah saya benar dalam mengasumsikan bahwa setiap kelas yang ingin saya jaga kerahasiaannya dalam kerangka kerja saya yang harus digunakan oleh kelas cepat sekarang harus dipublikasikan kepada siapa saja yang menggunakan kerangka kerja saya? Tampaknya bukan solusi yang ideal.
ospr
28

Ada dua kemungkinan. Menambahkan header yang diperlukan ke file header payung dan menjadikannya publik adalah satu cara. Namun, ini merupakan masalah jika header harus tersedia untuk Swift, tetapi tidak untuk umum.

Kemungkinan kedua yang akan membuat tajuk internal tersedia untuk Swift dijelaskan secara terperinci di sini . Pada dasarnya, peta modul yang mirip dengan yang berikut perlu dibuat:

module AwesomeKitPrivate {  
  header "../InternalClass.h"
  export *
}

Ini kemudian dapat dimasukkan dalam XCode menggunakan pengaturan:

SWIFT_INCLUDE_PATHS = $(SRCROOT)/AwesomeKit/ProjectModule  
Jan Rüegg
sumber
2
Luar biasa! Terima kasih. Teknik yang lebih disukai daripada membuat semua header publik.
David H
Sangat menyarankan solusi itu terhadap yang lain, dan untuk melihat tautan yang disediakan untuk solusi terperinci
Tancrede Chazallet
Ini adalah jawaban yang tepat, tetapi tergantung pada apa yang ingin Anda capai, Anda mungkin bisa lolos dengan menggunakan beberapa makro yang disediakan Apple yang banyak membantu Swop-Objc interop: developer.apple.com/documentation/swift/ ...
Joe Susnick
The headerpernyataan menerima path relatif. Apa yang Anda lakukan ketika Anda ingin menambahkan header dari kerangka kerja lain?
Georgios
13

Lihat Mengimpor Objective-C ke dalam Swift .

Untuk mengimpor kode Objective-C ke Swift dari kerangka kerja yang sama

  1. Di bawah Pengaturan Bangun, di Pengemasan, pastikan pengaturan Modul Menentukan untuk target kerangka kerja diatur ke "Ya".
  2. Di file header payung Anda, impor setiap header Objective-C yang ingin Anda paparkan ke Swift. Sebagai contoh:

        #import "XYZ / XYZCustomCell.h"
        #import "XYZ / XYZCustomView.h"
        #import "XYZ / XYZCustomViewController.h"
    
  3. Jadikan file yang disertakan untuk umum di bagian "Header" kerangka kerja dari "Build Phases" -nya.

  4. Bersihkan dan bangun kembali.

Swift akan melihat setiap tajuk yang Anda perlihatkan secara publik di tajuk payung Anda. Isi file Objective-C dalam kerangka itu akan tersedia di file Swift apa pun dalam target kerangka kerja itu secara otomatis, tanpa pernyataan impor apa pun. Gunakan kode Objective-C kustom Anda dengan sintaks Swift yang sama yang Anda gunakan dengan kelas sistem.

let myOtherCell = XYZCustomCell()
myOtherCell.subtitle = "Another custom cell"

Penting: "file payung header" berarti file {ModuleName} .h. BTW, nama targetnya adalah {ModuleName} .framework.

Ralph Shane
sumber
1
Saya ingin menggunakan file objc di dalam modul saya File Swift tetapi saya tidak ingin mengeksposnya ke modul lain. Bagaimana saya bisa melakukannya?
Sazzad Hissain Khan
0

Dalam kasus saya, hanya menghapus Objective-C Bridging Headerpengaturan dari kerangka kerja saya Build Settingsmembantu.

masukkan deskripsi gambar di sini

Denis Kutlubaev
sumber