2015-10-08 50 views
8

Tôi có dự án Swift và Objective-C hỗn hợp. Để truy cập API công cộng Swift trong Objective-C, người tiêu dùng API hiện phải nhập "MyModule-Swift.h". Tôi đã có một tiêu đề ô Object-C gọi là "MyModule.h". Tuy nhiên, việc nhập "MyModule.h" sẽ không hoạt động đối với API Swift. Tôi đã thử nhập "MyModule-Swift.h" trong tiêu đề ô, nhưng nó không tìm thấy nó (tôi giả sử vì nó được tạo ra trên bay bởi Xcode).Bao gồm -Swift.h trong tiêu đề ô

Bất kỳ đề xuất nào để người tiêu dùng API luôn có thể nhập "MyModule.h" để sử dụng các API công cộng được viết bằng Swift/Objective-C sẽ thực sự được đánh giá cao.

============================================== ======================

Chỉnh sửa: Tôi xin lỗi vì đã dành thời gian để đặt đúng câu hỏi. Tôi có một khung được gọi là MyModule.

Tôi có một lớp Objective-C được gọi là ABUser,

@interface ABUser: NSObject 

- (void)walk; 

@end 

tôi muốn thêm hành vi mới vào lớp này sử dụng Swift, vì vậy tôi định nghĩa một phần mở rộng

extension ABUser { 

func swiftWalk() 

} 

Bây giờ, nói rằng tôi muốn để truy cập phương thức swiftWalk được xác định trên ABUser từ ứng dụng Objective-C, tôi sẽ phải #import <MyModule/MyModule-Swift.h>. #import <MyModule/MyModule.h> sẽ hoạt động nếu tôi muốn sử dụng phương thức walk. Đây là giả định ô tiêu đề MyModule.h nhập ABUser.h.

Tôi luôn muốn ứng dụng Objective-C đến #import <MyModule/MyModule.h> và không bao giờ phải lo lắng về việc liệu một API được viết trong Objective-C hay Swift trong khuôn khổ. Vì vậy, tôi đã thử nhập MyModule-Swift.h vào ô tiêu đề MyModule.h. Nhưng, ứng dụng Objective-C của tôi không biên dịch nếu làm điều đó. Không chắc chắn, nếu điều này là do MyModule-Swift.h được tạo bởi Xcode khi đang di chuyển trong quá trình xây dựng.

Chỉnh sửa 2: Thêm một dự án mẫu để tạo lại vấn đề này ở đây: https://github.com/priteshshah1983/MyObjectiveCApp

Mã liên quan là trong ViewController.m. Việc xây dựng sẽ thất bại với chi nhánh master. Để nó hoạt động, hãy kiểm tra chi nhánh working.

Trả lời

-1

Hóa ra sử dụng @import MyModule; thay vì #import <MyModule/Module.h> cho phép sử dụng các phương pháp walkswiftWalk như mong đợi từ ứng dụng Mục tiêu-C.

Tôi thành thật không hiểu chi tiết, nhưng tôi hy vọng điều này sẽ giúp người khác. Xin vui lòng giải thích!

+0

"Vui lòng giải thích" Động cơ của tôi là gì? Bạn đã trao cho chính mình câu trả lời đúng, vì vậy tiền thưởng không thể nhận được. Bạn đã bỏ đi 50 điểm cho không có gì, quá ... Và câu hỏi vẫn còn khá thối. "Nhưng, điều này không làm việc" ngay cả _mean_? – matt

+0

Ok, tôi đã rút lại câu trả lời của mình là câu trả lời đúng. Xin lỗi, tôi không nghĩ rằng tôi có thể giải thích nó tốt hơn mặc dù điều này. Tôi nhận thấy bạn đã bỏ phiếu cho tôi vì điều đó! – pshah

+0

Bạn không thể chỉ hiển thị tất cả mã thực tế cần thiết để ai đó hiểu và tái tạo sự cố? – matt

2

Lý do sử dụng @import MyModule; hoạt động, là "mô-đun là một bao bì cùng với khuôn khổ thực thi và tiêu đề của nó" (from this SO post).

Nói cách khác, khi bạn @import MyModule;, Mục tiêu-C sẽ tự động nhập tất cả các tiêu đề nhanh và Mục tiêu-C liên quan đến mô-đun, trong khi bạn không thể bao gồm tiêu đề nhanh từ tiêu đề ô. Tôi đề nghị bạn hãy xem xét sự khác biệt giữa @import#import trong câu trả lời SO được liên kết.

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