2016-11-08 12 views
18

Tôi đang cố gắng làm việc trên dự án Swift và ObjectiveC hỗn hợp mà không có may mắn.Không tìm thấy tệp ModuleName-Swift.h trong xcode8

Dự án của tôi được làm bằng 6 mục tiêu:

  • App
  • Lõi
  • CoreTest
  • Tóm tắt
  • WatchKit mở rộng
  • WatchKit App

Tôi đã b een có thể thêm một lớp Swift có một thành viên đích (App) và sử dụng mã ObjectiveC đi qua từ App-Bridging-Header.h Mô hình "ObjectiveC into Swift code" hoạt động giống như một sự quyến rũ.

Thay vào đó, tôi đang gặp khó khăn với mô hình "Nhanh chóng vào mã ObjectiveC". Trong trường hợp cụ thể, tôi cần sử dụng một lớp Swift mới bên trong một tệp ObjectiveC .m là thành viên của bốn mục tiêu.

  1. Thêm một file Swift mới cho dự án cốt lõi xác định bốn thành viên (App, Core, Summary, WatchKit Ext)
  2. XCode hỏi để:

    Những gì tôi đã làm cho đến nay đây là tạo -Bridging-Header.h cho ba dự án Core, Summary và WatchKit Ext (App-Bridging-Header.h đã tồn tại vì nó đã được sử dụng trước đó), và tôi đồng ý (không biết tại sao nó tạo các tệp đó bên trong cùng một thư mục nhóm, nơi tôi thêm lớp Swift của mình nhưng không bao giờ liên kết)

  3. Tôi tạo lớp Swift thêm @objc quan trọng trước khi lớp
  4. tôi đi kiểm tra xem Objective-C tạo Interface Tiêu đề Tên được thiết lập cho tất cả các mô-đun, và có nó là
  5. tôi đi kiểm tra xem Định nghĩa Mô-đun được thiết lập để không trong tất cả các mô-đun và thiết lập để trong dự án chính, và có nó là
  6. tôi viết xuống nhập khẩu cho -Swift.h file cho tất cả bốn mục tiêu
  7. 01.
  8. Bên trong lớp học của tôi Objective-C tôi cố gắng sử dụng lớp Swift mới của tôi, dường như nó có vẻ làm việc (thậm chí autocompletion)
  9. tôi cố gắng để xây dựng dự án nhưng nó vẫn thất bại nói rằng các tập tin -Swift.h không phải là được tìm thấy

Tôi đã theo dõi Mix and Match guide of Apple và nhiều chủ đề SO bao gồm this one dường như dường như giải quyết cùng một vấn đề của tôi nhưng không hoạt động.

Cũng đã thấy thisthis nhưng không hoạt động.

Đã cố gắng xóa dữ liệu có nguồn gốc cũng như làm sạch toàn bộ dự án nhiều lần mà không có may mắn.

EDIT 1: Chi tiết

Đây là tuyên bố của lớp Swift tôi nhập khẩu RealmSwift

@objc class MyClass: Object {} 

Đây là đoạn sử dụng lớp Swift bên ObjectiveC

MyClass *app = [[MyClass alloc] init]; 

Nếu tôi tránh sử dụng #import ...- Swift.h việc xây dựng không thành công nói rằng tôi đang sử dụng eclared idenfier "MyClass" và đây là âm thanh.

Nếu tôi sử dụng #import ...- Tệp Swift.h nó nói rằng mô-đun X không thể tìm thấy mô-đun Y và cứ thế.

EDIT 2: Swift mô-đun tên

Bằng cách nhìn vào SWIFT_OBJC_INTERFACE_HEADER_NAME tài sản của mỗi mục tiêu tôi đã nhìn thấy rằng nó được xây dựng sử dụng cú pháp này $ (SWIFT_MODULE_NAME) -Swift.h làm tôi cần thay đổi SWIFT_MODULE_NAME đến MODULE_NAME?

EDIT 3: Nhập khẩu

này là tập hợp của hàng nhập khẩu cho tiêu đề Swift trong tập tin ObjectiveC .m. Tôi đang sử dụng tên mô-đun được chỉ định trong thuộc tính Cài đặt bản dựng tương đối. Lưu ý rằng một ký tự có ký tự '_' vì mục tiêu mở rộng của WatchKit có một khoảng trống trong tên đích.

#import "ProjectName_App-Swift.h" 
#import "ProjectName_Core-Swift.h" 
#import "ProjectName_Summary-Swift.h" 
#import "ProjectName_WatchKit_Extension-Swift.h" 

EDIT 4: Hội Chữ thập tầm nhìn của file -Swift.h

Tôi đã tryed sau:

  • Added một lớp Swift chỉ trong mục tiêu App
  • XCode tạo the Bridging Header
  • Đã chèn #import "ProjectName_App-Swift.h" vào tệp ObjectiveC chỉ được sử dụng bởi Ứng dụng
  • Sử dụng lớp Swift bên trong tệp này
  • Nó biên dịch! Và tôi có thể sử dụng lớp Swift

Khi lớp Swift được định nghĩa cho nhiều mục tiêu và tập tin ObjectiveC được sử dụng bởi những người nhiều mục tiêu nó không hoạt động. Lỗi xây dựng như sau: Không tìm thấy tệp mục tiêu X -> "ProjectName_TargetY-Swift.h". Có vẻ như mục tiêu không thể thấy các tệp mục tiêu -Swift.h khác.

Tôi đang làm gì sai? Cảm ơn sự giúp đỡ của bạn

+0

Bạn có thể chỉnh sửa cách bạn nhập tiêu đề đã tạo Swift không? – Sealos

+0

@Sealos đã thêm nhập vào câu hỏi gốc – LucioB

+0

Tôi tin rằng bạn đang thiếu tên dự án trong phần nhập tiêu đề. Bạn có phiền không? Như thế này: "Project_name_WatchKit_Extension-Swift.h" Ngoài ra, bạn có thể kiểm tra mô-đun mà tập tin đang làm SomeClass.classForKeyedUnarchiver trong một tập tin nhanh và nhận được điều đó. – Sealos

Trả lời

25

Giả định tôi đã thực hiện trong Chỉnh sửa 4 được bật là chính xác. Nếu dự án có nhiều mục tiêu, tệp "-Swift.h" không thể nhập tất cả trong một tệp .m ObjectiveC.

Vì vậy, có một giải pháp phải được áp dụng và thay đổi cài đặt xây dựng SWIFT_OBJC_INTERFACE_HEADER_NAME và làm cho nó giống nhau trên các mục tiêu khác nhau. Để làm như vậy thay đổi hướng dẫn mà tạo ra thuộc tính này từ $ (SWIFT_MODULE_NAME) -Swift.h để $ (PROJECT_NAME) -Swift.h như được giải thích here

Nó cũng có thể thiết lập các sản phẩm Cài đặt Tên Mô-đun trong Cài đặt Xây dựng giống nhau trên các mô-đun của bạn (tôi đặt nó thành $ (PROJECT_NAME)) để tệp -Swift.h được tạo có cùng tên trên tất cả các mô-đun. Điều này giúp loại bỏ sự cần thiết phải thêm/kiểm tra các macro tiền xử lý.

Sau khi thực hiện thư mục Clean Build này bằng cách nhấn Alt và vào menu Sản phẩm. Vì tên của phần đầu được chia sẻ giữa các mục tiêu bây giờ nó có thể được nhập một lần trong tệp .m ObjectiveC và tất cả các mục tiêu có thể được hưởng lợi từ các lớp Swift.

Nếu sau khi xây dựng nó vẫn hiển thị lỗi, đảm bảo rằng tiêu đề có thể đạt được từ XCode bởi Cmd nhấp vào tên của nó. Nó sẽ mở một tập tin có chứa mã tương tự như sau:

SWIFT_CLASS("_TtC27ProjectName_Summary11MyClass") 
@interface MyClass : NSObject 
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER; 
@end 

Nếu cần phải đảm bảo rằng những tiêu đề đang được tạo mở một terminal và sử dụng lệnh này

find ~/Library/Developer/Xcode/DerivedData -name "*Swift.h" 

Bạn sẽ thấy một tiêu đề cho mỗi target

Một vấn đề khác đã xảy ra với tôi sau những thay đổi đó là nó bắt đầu phát sinh lỗi trên mã ObjectiveC mà tôi không liên lạc. Vấn đề là do vị trí của quá trình nhập, như được báo cáo here:

Chính xác vị trí ở đầu tệp .m bạn #import tiêu đề bắc cầu ẩn có thể tạo sự khác biệt. Dấu hiệu thông thường của sự cố là bạn nhận được lỗi biên dịch “Loại không xác định”, trong đó loại không xác định là một lớp được khai báo trong Objective-C. Giải pháp là # import tệp .h chứa khai báo cho loại không xác định trong các tệp Mục tiêu-C của bạn, trước khi bạn #import tiêu đề bắc cầu ẩn. Việc phải làm điều này có thể là một vấn đề khó chịu, đặc biệt là nếu tệp Objective-C được đề cập không cần biết về lớp này, nhưng nó giải quyết vấn đề và cho phép biên dịch tiến hành.

Vào cuối, mã biên dịch và chạy trên thiết bị và trình mô phỏng!

+0

@Hiren Bạn đã cố tìm kiếm các tệp tiêu đề Swift bằng lệnh này từ thiết bị đầu cuối chưa? tìm ~/Library/Developer/Xcode/DerivedData -name "* Swift.h" – LucioB

+0

Nếu bạn có nhiều mục tiêu hơn, đừng quên tạo Bridging-Header cho tất cả chúng. Nó hoạt động trong dự án của tôi –

+0

vị cứu tinh ngày vinh quang! Chính xác vấn đề của tôi và chính xác là giải pháp! Cảm ơn ngài. –

2

Tôi gặp sự cố tương tự và gần như đã mất cả ngày để tìm ra vấn đề trong khi làm theo các đề xuất từ ​​các nhà phát triển đồng nghiệp trên StackOverflow và một vài nguồn khác.

Tôi đã nâng cấp từ XCode 7.3.1 lên XCode 8.2.1 và Swift 2.2 lên Swift 3.0.1.
Trong trường hợp của tôi, tôi đã tìm ra các tập tin PROJECT_NAME-Swift.h không được tạo ra tại địa chỉ:

~/Library/Developer/Xcode/DerivedData/PRODUCT-NAME-hdkrxixrxbiorwesffpqvefxsrzl/Build/Intermediates/PRODUCT-NAME.build/Debug/PRODUCT-NAME.build/Objects-normal/x86_64/PRODUCT-NAME-Swift.h.

Tôi đoán nó bằng cách nào đó cố gắng đề cập đến tập tin tiêu đề này từ đường dẫn ở trên và do đó lỗi. Tôi đã sao chép nó theo cách thủ công.Không xây dựng sạch sau này. Điều này giải quyết vấn đề của tôi và tập tin tiêu đề nhanh chóng bắt đầu được tạo ra để biên dịch và xây dựng thêm.

0

Đối với trường hợp của tôi, nó chạy tốt trong Xcode 8 nhưng file với

#import "Project-Swift.h" 

đã mất tích hàng nhập khẩu như mô tả của LucioB

Sử dụng Xcode 9 xóa bỏ những lỗi

0

Giải pháp cho tôi đã nhập tiêu đề nhanh được tạo qua cú pháp <>:

#import <OtherTargetWithSwiftClass/OtherTargetWithSwiftClass-Swift.h> 
0

Đây không phải là giải pháp cho câu hỏi nhưng vì nhiều người có thể kết thúc trên trang này tìm kiếm sự cố rằng tệp <ModuleName>-Swift.h không được tìm thấy (giống như tôi) Tôi muốn thêm một lý do khác có thể:

Khi có vấn đề về trình biên dịch trong một tệp nhanh, tiêu đề có thể không được tạo bởi xCode và do đó tệp bị thiếu.

Ít nhất trong trường hợp của tôi, <ModuleName>-Swift.h not found đã biến mất khi tôi sửa lỗi biên dịch trong tệp Swift.

Các vấn đề liên quan