Tiêu đề Swift to Objective-C không được tạo trong Xcode 6


242

Gần đây tôi đã làm việc để thêm Swift vào một dự án hiện có, để dùng thử nó theo cách thực tế.

Khi thêm tệp nguồn Swift vào dự án, tôi không gặp vấn đề gì về việc lấy "Bridging Header", nghĩa là Objective-C cho Swift.

Nhưng *-Swift.htệp tiêu đề được cho là để lộ các lớp Swift được đánh dấu @objchoặc các lớp con của các lớp ObjC, không tìm thấy ở đâu :-(

Tôi không thấy bất kỳ hướng dẫn cụ thể nào về cách thực hiện việc sử dụng lớp con mới của mình, được viết bằng Swift, trong mã ứng dụng chính của tôi (vẫn là Objective-C).

Ứng dụng mà tôi là nhà phát triển hàng đầu có một cơ sở mã khá lớn (70.000 dòng), vì vậy việc chuyển đổi nó trong một lần là không cần thiết.


5
Có nó làm. Nó thực sự hỏi bạn đang ở đâu trong IDE XCode, bạn cần phải làm gì đó để tạo Swift này -> ObjC đứng đầu, vì nó không xảy ra "theo mặc định" khi thêm mã Swift vào dự án ObjC hiện có.
David Kristensen

5
@Popeye Tôi không đồng ý. Trong trường hợp này, nếu bạn đang chỉnh sửa các tệp và biên dịch từ dòng lệnh, bạn sẽ không gặp phải vấn đề này. Đó là IDE đang thực hiện (hoặc được cho là thực hiện) thay mặt bạn đang gặp sự cố. Điều này rất có thể liên quan đến thiết lập dự án, đây chắc chắn là một chức năng IDE
gaige

11
@Popeye Từ các tài liệu (PDF) : Khi bạn nhập mã Swift vào Objective-C, bạn dựa vào tệp tiêu đề do Xcode tạo để hiển thị các tệp đó cho Objective-C. (Chữ in đậm của tôi, chữ nghiêng của Apple.) Đây rõ ràng là một câu hỏi về một tính năng của Xcode giúp bạn sử dụng Swift và Objective-C cùng nhau, và cả ba thẻ đều phù hợp.
Caleb

3
Tôi đã giải quyết nó với sự giúp đỡ của gaige và tài liệu. Và tôi không chỉ ném thẻ xung quanh: Trong trường hợp này, tệp tiêu đề NÊN được tạo bởi và hiển thị cho XCode. Nó đã không, do đó mang lại lỗi.
David Kristensen

3
@Popeye Không có gì sai lệch - Tôi đã sao chép trích dẫn trực tiếp từ trang 46. Bạn đã tìm thấy một đoạn tương tự nhưng khác nhau nói ít nhiều cùng một điều.
Caleb

Câu trả lời:


165

Bây giờ nó hoạt động.

  1. Dự án phải có Tên mô-đun sản phẩm không bao gồm khoảng trắng.
  2. Mô-đun xác định phải được đặt thành trong Cài đặt bản dựng, trong phần Đóng gói.

Cuối cùng cũng hoạt động. Xin cảm ơn tất cả mọi người vì đã giúp đỡ :-)


64
Build Settingsdưới Packaging, của tôi Defines Moduleđược đặt thành Yesvà tôi đã tạo một Product Module Namekhông có khoảng trắng. "* -Swift.h" không được tạo bởi XCode 6. ???
Loozie

25
Thêm một lưu ý: Trước tiên tôi đã cố gắng đặt các thuộc tính được đề cập ở cấp mục tiêu và nó không hoạt động, tệp "* -Swift.h" không được tạo. Nó hoạt động khi tôi đặt nó ở cấp độ dự án.
Marcin

22
Tôi cũng gặp vấn đề tương tự. Tôi đã Defines Moduleđặt Yescho cả dự án và mục tiêu và Product Module Nameđược xác định, không có khoảng trắng , nhưng dường như tôi không thể tạo tệp này.
Craig Otis

8
Chỉ trong trường hợp những người khác cũng bối rối như tôi ... Tôi đã phải gặp may mắn mù quáng ở đây và chỉ cần nhập tiêu đề, vì nó sẽ không tự động hoàn thành.
shawnwall

14
Bạn không thể nhập -swift trên các tệp tiêu đề (.h) chỉ trong khi thực hiện.
zirinisp

122

Tôi đã có một vấn đề tương tự và thấy rằng bạn chỉ có thể thêm

#import "ProductModuleName-Swift.h"

để các tệp obj-c .m, không phải các tệp .h cho tiêu đề ô được tìm thấy


2
Điều này là chính xác, và ... nếu tôi cần sử dụng lớp Swift trong tiêu đề objc thì sao? Tôi đã thử với tuyên bố chuyển tiếp, nó cũng không hoạt động.
Ixx

2
Xin lỗi, xin lỗi, chuyển tiếp khai báo hoạt động. Tôi quên thêm dấu chấm phẩy: P
Ixx

14
Đối với những người tìm kiếm trong tương lai: trong tiêu đề của bạn, hãy chuyển tiếp khai báo bằng cách thực hiện @ class YourSwiftClass ở đầu tệp .h của bạn (thay vì nhập tiêu đề ô)
rogueleaderr

4
Nếu tôi cần sử dụng Swift enum trong tệp tiêu đề thì sao?
jakecraige

1
Hơn nữa, nếu "#import ProductModuleName-Swift.h" nằm trong bất kỳ tệp tiêu đề nào, thì tệp ProductModuleName-Swift.h sẽ không được tạo ra (kể từ Xcode 7.2), vì vậy nếu nó đã bị xóa (ví dụ: bằng cách xóa bản dựng thư mục) sau đó bạn sẽ thấy các thông báo lỗi ở mọi nơi mà tệp được nhập, ngay cả đối với các tệp .m, làm tăng thêm sự nhầm lẫn.
rene

59

Tôi thấy rằng tôi phải sửa tất cả các lỗi xây dựng trước khi nó tạo tệp.

Vấn đề đối với tôi là đó là sự cố gà / trứng, trong đó tôi không thấy bất kỳ lỗi xây dựng nào cho đến khi tôi thực sự nhận xét về #importtuyên bố:

//#import "ProductModuleName-Swift.h"

trong đó tiết lộ một loạt các lỗi khác trong mã Swift của tôi.

Khi tôi đã sửa các lỗi mới này và xây dựng nguồn thành công, tôi đã bỏ qua #importvà chơi lô tô! Tiêu đề đã được tạo và nhập chính xác :)


Cảm ơn đây là chính xác những gì đã giữ tôi lên. Sau khi sửa các lỗi xây dựng nhanh, tôi rất tốt để đi. (Phiên bản Xcode 6.1.1)
Rick Roberts

10
Đây là một điểm tuyệt vời và một lý do chính đáng để bật cài đặt "tiếp tục xây dựng sau các lỗi" trong Xcode.
Kendall Helmstetter Gelner

Đó cũng chính xác là trường hợp của tôi: mất tích -Swift-h đã xảy ra sau khi thay đổi cùng mã nguồn nhanh chóng
Giorgio Calzolato

3
Sau khi thấy vấn đề về gà / trứng, tôi nhận ra vấn đề của mình, Tương tự tốt
d0ye

Vấn đề này luôn luôn quay trở lại với tôi (Xcode10) và tôi chỉ hiểu Xcode là lỗi. Đây là câu trả lời mặc dù
SumakuTension

44

Nếu bạn giống tôi, có lẽ bạn đã nhầm tên tiêu đề. Sau khi đập đầu một lúc, tôi tìm tập tin trong DerivingData và chắc chắn nó ở đó. Trên thiết lập của tôi (sử dụng thư mục dữ liệu dẫn xuất tiêu chuẩn, tôi tin):

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

Sẽ tìm thấy nó. Nếu không có gì trong thư mục đó khớp với thì Xcode không tạo ra nó.

Tôi đang sử dụng Xcode Phiên bản 6.2 (6C86e)


Điều này đã làm điều đó cho tôi. Tôi đã nghĩ rằng tự động hoàn thành sẽ nhận nó mà tôi chỉ cho rằng nó không có ở đó. Nhìn thấy trong thư mục xóa mọi thứ lên.
Sẽ

Đôi khi nhìn thấy là tin tưởng. Tôi đã không thể làm mọi thứ hoạt động cho đến khi làm theo câu trả lời được đề xuất và sau đó sử dụng các bước này để tìm tiêu đề được tạo, điều mà tôi ngạc nhiên, đã được đặt trước -Swift.hvà không phải tên của tệp Swift thực sự của tôi. Cảm ơn bạn!
Josh Habdas

Cảm ơn! Lưu lại cho tôi rất nhiều thời gian
estemendoza

43

Nếu tên mô-đun dự án của bạn có khoảng trắng trong đó, bạn phải thay thế khoảng trắng bằng dấu gạch dưới.

Ví dụ: nếu tên dự án của bạn là "Dự án của tôi", bạn sẽ sử dụng:

#import "My_Project-Swift.h"


12
Nếu tên mô-đun dự án của bạn có dấu gạch nối trong đó, chúng cũng nên được thay thế bằng dấu gạch dưới. Vì vậy, nếu tên dự án của bạn là "My-Project", hãy sử dụng #import "My_Project.h"
Jeff Ames

6
Ngoài ra, nếu tên mô-đun dự án của bạn bắt đầu bằng một số, nó cũng nên được thay thế bằng dấu gạch dưới. "1st Project" sẽ là "_st_Project-Swift.h"
Danation

31

* Điều quan trọng duy nhất là: *

để sử dụng "Tên mô-đun sản phẩm" được xác định trong mục tiêu, theo sau là -Swift.h

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

Không có vấn đề nếu thông số "Xác định mô-đun" được đặt thành Có hoặc Không hoặc nếu Dự án "Tên mô-đun sản phẩm" không được đặt.

Nhắc nhở: Các lớp Swift phải xuất phát từ NSObject hoặc được gắn thẻ với thuộc tính @objc để được hiển thị với ObjectiveC / Foundation || Ca cao ...


1
Điều đó đúng: không cần "Xác định mô-đun" trong Dự án hoặc trong Mục tiêu
Giorgio Calzolato

25

Tôi muốn thêm một lý do nữa mà bạn có thể tìm thấy một vấn đề với điều này - Tôi đã tạo ra một khung công tác pha trộn mã Swift và Objective-C. Tôi không thể nhập các lớp Swift bên ngoài khung - Tôi đã kiểm tra tệp -Swift.h và nó đã được tạo nhưng trống.

Vấn đề hóa ra rất, rất đơn giản - Tôi đã không tuyên bố bất kỳ lớp Swift nào của mình công khai! Ngay khi tôi thêm từ khóa công khai vào các lớp, tôi đã có thể sử dụng chúng từ các lớp trong và ngoài khung.

Cũng cần lưu ý, bên trong khung (chỉ bên trong các tệp .m như một câu trả lời khác đề cập) tôi đã phải nhập tệp -Swift.h dưới dạng:

#import <FrameworkName/FrameworkName-Swift.h>

2
Trong Khung tôi cũng lưu ý rằng để sử dụng các lớp Swift, chúng phải được kế thừa từ NSObject (thậm chí @objc sẽ không trợ giúp) và tất cả các phương thức / thuộc tính phải được công khai.
dmitrynikolaev

3
Ít nhất là trong bản phát hành trước XCode 7 hiện tại, cho đến khi bạn kế thừa từ NSObject, chúng sẽ không có sẵn trong tiêu đề swift được tạo.
dmitrynikolaev

100% KHÔNG khắc phục vấn đề của tôi. MỌI giải pháp là "làm cho lớp học của bạn công khai". Tôi đã làm điều này. Giai đoạn = Stage. Nó vẫn KHÔNG tiết lộ các lớp Swift trong các dự án sử dụng khung.
datWooWoo

@lespommes, bạn nên viết một câu hỏi và đưa ra một dự án mẫu ở đâu đó thể hiện vấn đề, ai đó có thể hiểu chuyện gì đang xảy ra ... Tôi chỉ đưa ra câu trả lời của mình như một giải pháp khả thi, bởi vì đó là lỗi hiển thị mà tôi mắc phải nhất thường xuyên.
Kendall Helmstetter Gelner

2
Ồ vâng, gợi ý của bạn với việc nhập khẩu cuối cùng đã giúp tôi! Cảm ơn rất nhiều!
endowzoner

14

Tôi đã từng gặp vấn đề tương tự. Có vẻ như bạn phải điều chỉnh cài đặt (Xác định mô-đun và tên mô-đun sản phẩm) trước khi bạn thêm tệp Swift đầu tiên của mình.

Nếu bạn làm điều đó sau đó, tệp "* -Swift.h" sẽ không được tạo cho dự án này ngay cả khi bạn thêm tệp Swift hoặc xóa tệp Swift và tạo tệp mới.


Tôi không chắc đó là sự thật. Tôi đã không quyết định kích hoạt 'Xác định mô-đun' cho đến khi sau khi tạo nhiều tệp nhanh và tôi đã có thể nhận được một -Swift.h tốt.
Michael Peterson

Tôi thực sự buồn khi báo cáo đây chính xác là vấn đề tôi gặp phải :( Tôi đã phải xóa .swift của mình và thêm lại, và sau đó tất cả đều hoạt động.
StuFF mc

2
Giờ thì sao? Tôi đang thay đổi cả mã Swift và ObjC. Dự án của tôi-Swift.h không cập nhật. Tôi thậm chí đã cố gắng để xóa các tập tin tiêu đề.
Suhail Bhat

2
Tôi đã phải viết cái này lên, dev.iachpered.it/iachperedit/?p=980 . Mẹo để cập nhật cài đặt bản dựng trước khi thêm tệp Swift là chìa khóa đối với tôi.
Joe

Điều này có nghĩa là tôi phải tạo lại dự án và thêm lại mọi thứ nếu tôi không làm điều này? Bất kể tôi làm gì, dường như tôi không thể tạo tệp * -Swift.h.
kgreenek

13

Cho phép tôi chia sẻ kinh nghiệm của mình khi cố gắng sử dụng Swift trong một dự án objc cũ. Tôi không cần phải thiết lập Defines moduleđể YES.

Trong trường hợp của tôi, tôi cần phải chắc chắn rằng có một Tiêu đề Cầu nối objc. Chỉ tên tiêu đề giao diện được tạo đã có mặt trong cài đặt bản dựng của tôi.

Thiếu tiêu đề bắc cầu

Điều này dẫn đến một tệp MyApp-Swift.h được tạo, nhưng không có bất kỳ dấu vết nào của các lớp Swift của tôi.

Tài liệu của Apple nói rằng bạn sẽ được nhắc tạo tiêu đề bắc cầu khi thêm tệp nhanh chóng đầu tiên của mình. Vâng, tôi đã không. Tôi đã thêm một cách thủ công một MyApp-Bridging-header.htệp và chỉ vào nó trong trường "Tiêu đề cầu nối Objective-C". Điều đó làm cho tệp MyApp-Swift.h của tôi trở nên phổ biến với các lớp Swift của tôi.

Tài liệu: Nhập Swift vào Objective-C


vâng, vì bất kỳ lý do gì, tệp ObjC Swift.h của tôi được tạo bằng các tiêu đề lớp Swift chỉ sau khi tôi đã thêm tệp tiêu đề bắc cầu trống vào dự án!
Andrew

Tương tự ở đây. Mã Swift của tôi không được nhập vào tệp * -Swift.h được tạo cho đến khi tôi thêm tệp tiêu đề bắc cầu Objective-C trống.
Nik

12

Đây là một biến thể khác của moduleName-Swift.h không được tạo.

Tôi đã quyết định đưa Biểu đồ IOS vào dự án của mình nhưng không muốn trộn lẫn các nguồn trong cùng thư mục, vì vậy tôi đã đặt thư mục Dự án Biểu đồ bên cạnh thư mục dự án mã của tôi. Tôi đã kéo dự án Charts vào Thanh điều hướng dự án của tôi và đưa khung vào danh sách Binaries nhúng của mục tiêu dự án của tôi trong cài đặt dự án chung và đặt công tắc nhúng Nội dung nhúng Swift có trong tab Cài đặt xây dựng của dự án trong phần Tùy chọn xây dựng .

Tệp moduleName-Swift.h của dự án của tôi sẽ không bao giờ tạo ra bất kể các thiết bị chuyển mạch hoặc cài đặt nào được đề xuất ở đây. Cuối cùng, bằng cách sử dụng phương pháp tìm kiếm các tệp -Swift.h của Lou Z, tôi thấy rằng tệp Charts-Swift.h đang được tạo sâu trong thư mục Build xcode của dự án của tôi trong Charts.framework / Headers /

Giải pháp sử dụng gói Swift ios-chart Swift của Daniel Gindi mà không bao gồm mã trong thư mục nguồn của dự án của tôi là thêm:

#import "Charts/Charts-Swift.h"

Để các mô-đun biểu đồ dữ liệu dự án của tôi.


Có thể thay đổi / tùy chỉnh mẹo công cụ trong biểu đồ IOS không? Nếu có thì bạn có thể đưa ra một ví dụ?
Amit Chauhan

12

Tên tệp luôn được đặt trước tên Target của bạn . Nó được gọi là Tên sản phẩm nhưng thực tế nó là tên mục tiêu. Vì vậy, nếu bạn muốn nó xây dựng cho một mục tiêu mới, hãy sẵn sàng mong đợi that_target-Swift.htập tin.

Một cách để xử lý việc này là

  1. Thêm một bộ tiền xử lý cho mỗi mục tiêu của bạn là tên của chính mục tiêu của bạn (không có dấu cách). Ví dụ. MY_TARGET=1. Thêm phần này vào Cài đặt dự án-> Cài đặt bản dựng-> Macro tiền xử lý cho từng mục tiêu của bạn.
  2. Nếu bạn đang sử dụng tệp PCH,

Thêm các dòng này trong tệp PCH

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

Ưu điểm của việc sử dụng tệp PCH là bạn không cần phải bao gồm các tiêu đề ở mọi nơi.

  1. Nếu bạn không sử dụng tệp PCH, chỉ cần thêm các dòng tương tự vào một tiêu đề duy nhất và bao gồm tiêu đề đó bất cứ nơi nào bạn cần để sử dụng các lớp swift.

Điều này sẽ làm việc tốt.


Tôi thực sự thích sử dụng giải pháp này hơn là nhập tiêu đề trực tiếp vào nguồn của bạn. Tôi có một cấu trúc dự án phức tạp trong đó cùng một mã nguồn đang được sử dụng bởi nhiều mục tiêu / dự án. Điều này tránh việc thêm một câu lệnh #if #else lộn xộn trên toàn bộ mã của tôi. Cảm ơn câu trả lời!
Ryan

Điều này đã cứu ngày của tôi. Tôi đặt 5 dòng mã vào tệp "Something-Swift-Headers.h" (có includetrong đó). Sau đó, tôi nhập tệp mới này từ nơi tôi cần. Tôi ủng hộ không đặt cái này bên trong PCH hoặc bất kỳ tệp .h nào để tránh phụ thuộc theo chu kỳ và sử dụng tiêu đề tiện lợi trong các tệp .m.
ctietze

Điều này là sai trên nhiều cấp độ. Thứ nhất, .pchcác tập tin được khuyến khích rất nhiều . Thứ hai, tên tệp chứa tên Sản phẩm và KHÔNG phải tên đích. Có thể là trùng hợp ngẫu nhiên, nhưng nó đã sử dụng tên Sản phẩm!
Iulian Onofrei

10

Nếu Xcode thực sự đang tạo tiêu đề -Swift.h của bạn (sâu bên trong DeruredData) nhưng nó không đề cập đến các lớp Swift của bạn, hãy đảm bảo bạn cũng có một tiêu đề bắc cầu được xác định. Cách tôi đọc các tài liệu ngụ ý tôi chỉ cần điều đó để gọi Objective-C từ Swift, nhưng dường như cũng cần thiết để gọi Swift từ Objective-C.

Xem câu trả lời của tôi: https://stackoverflow.com/a/27972946/337392

EDIT: Đó là do các sửa đổi truy cập công khai và nội bộ, như cuối cùng tôi đã tìm thấy giải thích trong các tài liệu của Apple: -

Theo mặc định, tiêu đề được tạo chứa các giao diện cho khai báo Swift được đánh dấu bằng công cụ sửa đổi công khai. Nó cũng chứa những thứ được đánh dấu bằng công cụ sửa đổi bên trong nếu mục tiêu ứng dụng của bạn có tiêu đề bắc cầu Objective-C.


Vâng, điều này thực sự có ích. Tôi không biết điều đó. Tôi nghĩ rằng nó chỉ cần cho Obj-C từ trường hợp sử dụng Swift.
gật đầu

Vui vẻ giúp đỡ. Tôi đã chỉnh sửa câu trả lời vì tôi đã tìm ra lý do cho hành vi này.
Echelon

7

Phân biệt những gì nhiều người có ở đây, nhưng thêm một ảnh chụp màn hình thích hợp. Mã Swift và Obj-C chắc chắn có thể sống cùng nhau. Đây không phải là tất cả hoặc không có trò chơi.

Để truy cập các tệp Swift trong Mục tiêu-C của bạn, tất cả những gì bạn cần làm là thêm cuộc gọi này vào tệp Obj-C của bạn (trong tệp .m / tệp thực hiện):

#import "{product_module_name}-Swift.h"

(Trong đó {product_module_name} đại diện cho tên mô-đun sản phẩm của dự án của bạn). Thay vì cố gắng đoán tên mô-đun sản phẩm của bạn hoặc tìm ra các trường hợp góc có khoảng trắng và ký tự đặc biệt, chỉ cần chuyển đến tab cài đặt xây dựng trong dự án và nhập "tên mô-đun sản phẩm" - thanh tra sẽ tiết lộ cho bạn. Của tôi là một cái gì đó tôi không mong đợi nó được. Kiểm tra ảnh chụp màn hình này nếu bạn bối rối.

nhập mô tả hình ảnh ở đây

Và để mã Obj-c hoạt động trong Swift, bạn chỉ cần thêm tệp tiêu đề bắc cầu và nhập các tiêu đề Obj-C có liên quan ở đó.


1
Có nên không #import?
Iulian Onofrei

Giả sử tên dự án của tôi là ABC, sau đó "ABC-Swift.h", phải tồn tại trong dự án của tôi phải không? Tôi không thể tìm thấy nó. Có cần phải tự tạo nó không? Tôi không tự tạo bất kỳ tệp swift nào, chỉ bao gồm một vỏ ca cao được viết bằng swift.
5

Tiêu đề Cầu nối (trong trường hợp của bạn, ABC-Swift.h) không được tạo tự động. Khi bạn cố gắng tạo tệp Swift đầu tiên của mình trong dự án Obj-C, Xcode thường nhắc bạn thêm một tệp. Bạn cũng có thể tự tạo một tiêu đề Cầu nối như được hiển thị ở đây (control + f cho 'tiêu đề bắc cầu'): developer.apple.com/l
Library / content / document / Swift / Khăn

5

Điều quan trọng nhất là tập tin này là vô hình !!! Ít nhất là trong Xcode6 beta5. Sẽ không có tệp nào có tên "YourModule-Swift.h" trong không gian làm việc của bạn. Chỉ cần đảm bảo rằng bạn có tên mô-đun và xác định mô-đun được đặt thành có và sử dụng nó trong lớp Objective-C của bạn.


5

Ok, đây là tất cả những thứ bạn thực sự cần!

1. Xóa tất cả các tệp nhanh chóng mà bạn đã thêm và biên dịch mã mà không có bất kỳ lỗi nào.

----------

nhập mô tả hình ảnh ở đây

----------

2.Đi tới cài đặt bản dựng "Dự án" và đặt tên mô-đun sản phẩm. Dự án phải có Tên mô-đun sản phẩm không bao gồm khoảng trắng.

----------

nhập mô tả hình ảnh ở đây

----------

3. Mô-đun xác định phải được đặt thành Có trong Cài đặt bản dựng, trong Bao bì, trong dự án của bạn và không nhắm mục tiêu!

----------

nhập mô tả hình ảnh ở đây

----------

4.Bây giờ hãy tạo tệp nhanh hoặc trình điều khiển xem, trong tệp-> newFile->

----------

nhập mô tả hình ảnh ở đây

----------

Nó sẽ yêu cầu tạo một tiêu đề bắc cầu, cho phép nó tạo một tiêu đề. Nếu bạn đã từ chối nó một lần, bạn sẽ phải thêm thủ công -Bridging-Header.h

5.Thêm @objc vào bộ điều khiển, để báo cho trình biên dịch biết rằng có một số tệp nhanh, cần được tiếp xúc với ObjectiveC

----------

nhập mô tả hình ảnh ở đây

----------

6.Xây dựng dự án và nhập #import "-Swift.h" trong bất kỳ bộ điều khiển objectC nào, và nó sẽ hoạt động! Bạn có thể nhấp chuột vào nó để xem tập tin thực tế!

----------

nhập mô tả hình ảnh ở đây

----------

Hi vọng điêu nay co ich!


>> Bạn có thể nhấp chuột vào nó để xem tập tin thực tế! Điều này thật tuyệt
Jagan

4

Câu trả lời này giải quyết trường hợp sử dụng trong đó bạn có thể đã có một số mã Objective-C gọi các lớp Swift và sau đó bạn bắt đầu nhận được lỗi này.

Cách khắc phục sự cố

Các bước sau đây cuối cùng đã giải quyết tất cả các vấn đề cho tôi. Tôi đã đọc ở trên một người nào đó đề cập đến "con gà và quả trứng" và chính xác đó là khái niệm dẫn tôi đến thủ tục này. Quá trình rõ ràng này cho thấy rằng người ta phải loại bỏ bất kỳ lớp Objective-C nào tham chiếu các lớp Swift cho đến sau khi tiêu đề được tạo.

  1. Nhận xét câu lệnh #import "ProductModuleName-Swift.h" trong tệp triển khai Objective-C của bạn
  2. Nhận xét bất kỳ tài liệu tham khảo nào trong tệp triển khai Objective-C cho Swift Classes
  3. Dọn dẹp & Xây dựng
  4. Giải quyết tất cả các lỗi / cảnh báo
  5. Xóa nhận xét về câu lệnh #import "ProductModuleName-Swift.h"
  6. Dọn dẹp & xây dựng (thành công hoặc sửa bất kỳ lỗi nào còn lại, xác minh rằng bạn không tham chiếu bất kỳ lớp Swift nào trong Objective-C vào thời điểm này . Nếu vậy hãy tạm thời nhận xét những lỗi này)
  7. Xác minh rằng "ProductModuleName-Swift.h" được tạo bởi Cmd-Nhấp vào tên lớp của câu lệnh #import "ProductModuleName-Swift.h"
  8. Xóa nhận xét về mã tham chiếu các lớp Swift trong tệp triển khai Objective-C.
  9. Làm sạch và xây dựng như bình thường ("ProductModuleName-Swift.h" phải được tạo và các lớp Swift tham chiếu mã Objective-C của bạn có thể được sử dụng như bình thường)

Nota Bene: Các câu trả lời về việc thay đổi không gian thành dấu gạch dưới và Mô-đun xác định thành CÓ như đã nêu ở trên vẫn được áp dụng khi thực hiện quy trình này, cũng như các quy tắc được chỉ định trong Tài liệu của Apple .

Cầu nối đường dẫn

Trong một lỗi, tệp ProductModuleName-Bridging-Header.h không được tìm thấy trong quá trình xây dựng. Thực tế này đã tạo ra một lỗi

<unknown>: 0: error: bắc cầu tiêu đề '/Users/Shared/Working/abc/abc-Bridging-Header.h' không tồn tại

Kiểm tra chặt chẽ hơn các lỗi chỉ ra rằng tệp sẽ không bao giờ tồn tại ở vị trí được mô tả vì nó thực sự nằm ở ( một đường dẫn sai )

'/Users/Shared/Working/abc/abc/abc-Bridging-Header.h'. tìm kiếm nhanh các cài đặt xây dựng mục tiêu / dự án để thực hiện chỉnh sửa theo cách thủ công và tệp abc-Swift.h một lần nữa được tạo tự động.

cài đặt bản dựng


1
Điều gì xảy ra nếu dự án của bạn quá lớn đến nỗi việc bình luận tất cả các tham chiếu về mã nhanh chóng trong mục tiêu c là không thực tế?
Andrew Morris

3

Bạn phải nhập một tiêu đề trong các lớp Objective-C, đó là:

#import “ProductModuleName-Swift.h”

Nó được tạo tự động, trên tham chiếu có ghi "Bất kỳ tệp Swift nào trong mục tiêu của bạn sẽ hiển thị trong các tệp Objective-C .m có chứa câu lệnh nhập này."


24
Nhưng, khi tôi làm điều đó, tôi gặp lỗi xây dựng, AppName-Swift.h không tồn tại. Trong khi đó, AppName-Bridging-Header.h không tồn tại.
David Kristensen

5
@DavidKristensen: Bạn có nhận được giải pháp cho nó không?, Vì tôi đã mắc kẹt với cùng một vấn đề
BaSha

2

Một tập tin thực tế trong dự án không được tạo ([ProductModuleName] -Swift.h). Cmd + Nhấp vào quá trình nhập sẽ tạo ra nó một cách nhanh chóng (và trong bộ nhớ) để bạn có thể xem cách liên kết được thực hiện hoặc mở một tệp ở đâu đó trong một số thư mục bộ đệm Xcode, nhưng nó không nằm trong thư mục dự án.

Bạn cần đặt prop dự án Mô-đun xác định (trong Cài đặt bản dựng của mục tiêu) thành và nếu tên mô-đun của bạn có dấu cách hoặc dấu gạch ngang - hãy sử dụng _ trong tất cả các lần nhập tệp [ProductModuleName] -Swift.h.

Bạn có thể nhập nó trong tất cả các tệp .h và .m nơi bạn sử dụng các loại swift hoặc bạn có thể nhập nó trong .pch.

Vì vậy, nếu Mô-đun (dự án) của tôi được đặt tên là "Dự án thử nghiệm", tôi sẽ nhập nó như thế này, trong tệp .pch của dự án của tôi (chỉ ở đó):

#import "Test_Project-Swift.h"

2

Chỉ cần một đầu lên cho bất cứ ai sử dụng "." trong đó tên dự án. Xcode sẽ thay thế "." với dấu gạch dưới "_" cho phiên bản Swift của tệp tiêu đề bắc cầu. Thật kỳ lạ, Bridging-Header.h được tạo ra không thay thế các dấu chấm bằng dấu gạch dưới.

Ví dụ: một dự án có tên My.Project sẽ có các tên tệp Bridging Header sau đây.

Bridging-Header.h (Được tạo tự động)

My.Project-Bridging-Header.h

Swift.h

My_Project.h

Tôi hy vọng điều này sẽ giúp bất cứ ai sử dụng một khoảng thời gian và bị mắc kẹt như tôi. Tập tin này có thể được tìm thấy tại vị trí sau đây.

Macintosh HD / Users / người dùng /Library/Developer/Xcode/DerivedData/My.Project-fntdulwpbhbbzdbyrkhanemcrfil/Build/Intermediates/My.Project.build/Debug-iphonesimulator/My.Project.build/DerivedSources

Bảo trọng,

Jon


2

Dự án phải có Tên Mô-đun không bao gồm khoảng trắng. Mô-đun xác định phải được đặt thành Có trong Cài đặt bản dựng, trong phần Đóng gói. đã nhận xét tuyên bố #import:

Nếu bạn vẫn gặp lỗi khi nhập "ProductModuleName-Swift.h" thì

// # nhập "ProductModuleName-Swift.h"

trong đó tiết lộ một loạt các lỗi khác trong mã Swift của tôi.

Khi tôi đã sửa các lỗi mới này và xây dựng nguồn thành công, tôi đã bỏ qua #import và bingo! Tiêu đề đã được tạo và nhập chính xác :)


Vấn đề của tôi là tôi cũng có lỗi trong mã Swift của mình, nhưng tôi không biết điều đó cho đến khi tôi không phát hiện ra tệp -Swift.h. Cảm ơn!
Sẽ

1

Tôi tìm thấy một mẹo luôn luôn làm việc với tôi.

  1. Tạo #import "ProductModuleName-Swift.h" của bạn trong tệp appDelegate.h và trong tệp ProductName-Prefix.pch của bạn. Nếu bạn không có nó trong xcode 6, bạn có thể tạo nó theo cách này Tại sao ProjectName-Prefix.pch không được tạo tự động trong Xcode 6?
  2. Lệnh + shift + k để xóa mã của bạn, nếu bạn gặp lỗi về "ProductModuleName-Swift.h" của bạn, hãy xóa nó khỏi tệp appDelegate.h.
  3. Làm sạch mã của bạn một lần nữa. Bây giờ mọi thứ sẽ hoạt động như một lá bùa
  4. Nếu bạn lại nhận được lỗi về "ProductModuleName-Swift.h", bây giờ hãy tạo lại trong tệp appDelegate.h và làm sạch lại mã của bạn.

Thực hiện công việc này (xóa và tạo "ProductModuleName-Swift.h" từ tệp appDelegate.h và làm sạch mã của bạn) mỗi khi bạn nhận được lỗi này để tắt tiếng.


1

Tôi tìm thấy giải pháp này

  • Tạo SwiftBridge.h
  • đặt #import sản phẩmModuleName-Swift.h phạm
  • Đặt tệp .h này ở chế độ công khai (quan trọng) Chọn tệp -> Trong Hiển thị tệp Trình kiểm tra (thanh bên phải) -> Đặt ở chế độ công khai

Bây giờ bạn có thể

#import "SwiftBridge.h"

thay vì ProductModuleName-Swift.h

Đây là một giải pháp khắc phục, đối với phiên bản Xcode tiếp theo tôi nghĩ vấn đề này sẽ được giải quyết. Chúc may mắn


Không hoạt động. Chỉ cần thử nó. Dòng này #import “ProductModuleName-Swift.h”chỉ xuất hiện một lỗi trong tệp SwiftBridge.h thay vì tệp mã Objective-C ban đầu.
Supertecnoboff

1

Tôi đã gặp khó khăn trong việc xác định tên mô-đun / mục tiêu nhập khẩu của swift của tiêu đề. Tôi cũng đã đọc rất nhiều bài viết ở đây.

Nhưng câu trả lời dứt khoát cho tên dự án của bạn với tất cả các ký tự đặc biệt được bao gồm (có thể là '.' Hoặc một số hoặc khoảng trắng) - bạn có thể tìm thấy văn bản sẽ hoạt động cho bạn trong " Tên mô-đun sản phẩm " trong Cài đặt bản dựng của mục tiêu .

Ví dụ: tên mục tiêu của tôi bắt đầu bằng số - "1mg" và trường được đề cập ở trên hiển thị "_mg" làm tên mô-đun của tôi.

vì vậy tôi đã sử dụng #import "_mg-Swift.h" và nó đã hoạt động.

Tên mô-đun sản phẩm trong cài đặt xây dựng của mục tiêu cung cấp tên mô-đun chính xác sẽ hoạt động cho dự án của bạn


Nếu bạn có thể chỉnh sửa trong một liên kết đến một ảnh chụp màn hình, tôi có thể chỉnh sửa câu trả lời của bạn để hiển thị nó cho bạn.
SuperBiasedMan

1

Trong trường hợp của tôi, tôi phải đặt mục tiêu triển khai thành ít nhất là OS OS 10 10.9 và -Swift.htiêu đề được tạo tự động. Hãy nhớ rằng bạn có thể nhận được rất nhiều cảnh báo không dùng nữa khi bạn thay đổi phiên bản mục tiêu triển khai, đặc biệt là khi bạn có một cơ sở mã Objective C cũ và rất lớn. Trong trường hợp của chúng tôi, chúng tôi cũng có rất nhiều việc phải làm trong các tệp XIB và xem các lớp.


2
Đối với những người khác - hãy tìm trong Cài đặt bản dựng cho mục tiêu của bạn, lấy tên chính xác "MyProject-Swift.h" - đó là những gì bạn cần đưa vào như "#include" MyProject-Swift.h "trong các tệp Objc thích hợp. BTW, đây câu trả lời thực sự đã giúp tôi - làm việc để chuyển đổi một số nguồn mở ObjectiveC cũ hơn.
David H

0

Nếu bạn đã có thể xây dựng một dự án trước đây, không có vấn đề liên quan đến “ProductModuleName-Swift.h” not foundlỗi và bây giờ bạn lại gặp phải lỗi khó chịu đó, lý do có thể nằm ở những thay đổi gần đây của bạn.

Đối với tôi điều này là do (vô tình) .swiftmã hóa tập tin không chính xác . Hoàn nguyên các thay đổi và mang lại thủ công, thực hiện công việc.


0

Đây có thể là một điểm rõ ràng (có thể quá rõ ràng), nhưng bạn phải có ít nhất một tệp nhanh chóng trong dự án để tạo tiêu đề. Nếu bạn đang viết mã soạn sẵn hoặc mã cấu hình với ý định viết nhanh thì việc nhập sẽ không hoạt động.


0

Tôi đã phải xóa mã swift WatchOS2 khỏi dự án Objective C của mình. Và chỉ sau đó XCode được cung cấp để tạo -Swift.h


0

Tôi đã gặp vấn đề tương tự nhưng dự án của tôi đã được biên dịch trước đó và đột nhiên gặp lỗi sau vài lần thay đổi mã tập tin. Tôi phải mất một thời gian để tìm ra lý do tại sao tôi nhận được lỗi 'Không tìm thấy tệp' cho tệp myproject-swift.h. Các thay đổi mã tôi đã thực hiện có một số lỗi. Xcode không chỉ đặt các lỗi đó thay vào đó mọi lúc hiển thị 'Lỗi không tìm thấy tệp'. Sau đó nhận được bản sao của mã phiên bản trước đó và tôi so sánh với mã mới và từng tệp được hợp nhất từng cái một. Sau mỗi tập tin hợp nhất tuân thủ dự án để tìm lỗi. Vì vậy, điểm mấu chốt là nếu bạn có lỗi trong mã của mình, Xcode có thể chỉ hiển thị 'lỗi không tìm thấy tệp' cho tệp myproject-swift.h. Nhiều khả năng bạn có lỗi biên dịch trong dự án của bạn. Làm sạch những lỗi đó và nó sẽ hoạt động.


0

Nếu bạn đang sử dụng một cái gì đó như Cocoapods (và làm việc ngoài không gian làm việc chứ không phải dự án), hãy thử mở dự án và xây dựng nó trước khi mở không gian làm việc và tòa nhà. YMMV.


0

Đôi khi bạn chỉ cần bỏ đặt và sau đó đặt lại tư cách thành viên đích trên tệp obj-c .m.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.