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.
- 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)
- 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)
- Tôi tạo lớp Swift thêm @objc quan trọng trước khi lớp
- 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à
- 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 để có trong dự án chính, và có nó là
- tôi viết xuống nhập khẩu cho -Swift.h file cho tất cả bốn mục tiêu 01.
- 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)
- 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 this và this 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
Bạn có thể chỉnh sửa cách bạn nhập tiêu đề đã tạo Swift không? – Sealos
@Sealos đã thêm nhập vào câu hỏi gốc – LucioB
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