2017-11-28 13 views
5

Tôi đang thêm mã nhanh vào một dự án Mục tiêu-C hiện có. Tôi gặp sự cố khi tham chiếu đến định nghĩa từ tiêu đề tiền tố hiện tại.Định nghĩa lớp tham chiếu từ tiêu đề tiền tố trong swift

Tôi có một lớp được gọi là MyClass, quy định tại Objective-C với .h:

@interface MyClass 
+(instancetype)myClass; 
-(void)doStuff; 
@end 

Và .m:

@implementation MyClass 
+ (instancetype) myClass 
{ 
    // More to it than this, but this illustrates the setup 
    return [[MyClass alloc] init]; 
} 

- (void)doStuff 
{ 
    // Do something interesting 
} 
@end 

Tiêu đề prefix MyProj-Prefix.pch chứa:

#define MYCLASS MyClass 
#define SOMEVAR @"Hello" 

Tôi đã tạo tiêu đề cầu nối chứa:

dự án
#import "MyProj-Prefix.pch" 

Các chứa mã Objective-C sử dụng các định nghĩa lớp, ví dụ

[[MYCLASS myClass] doStuff]; 

Tôi muốn phản ánh điều này trong mã nhanh mới của mình. Tôi có thể xem và tham chiếu biến đã xác định, nhưng lớp đã xác định không hiển thị. ví dụ.

let someStr = SOMEVAR // This compiles 
MYCLASS.myClass.doStuff() // MYCLASS isn't visible 

Bất kỳ con trỏ nào về cách đạt được điều này? Tôi thậm chí không chắc chắn nếu điều này là có thể trong nhanh chóng.

Trả lời

1

Sự cố này sẽ tồn tại ngay cả khi #define MYCLASS MyClass nằm trong bất kỳ tiêu đề nào khác, không nhất thiết phải trong tiêu đề tiền tố. Điều này là do các chỉ thị tiền xử lý thường không được nhập vào Swift. Tuy nhiên, các macro đơn giản được nhập nếu chúng có thể được ánh xạ tới các hằng số toàn cầu, có thể cho SOMEVAR, nhưng không thể là MYCLASS. Xem https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithCAPIs.html#//apple_ref/doc/uid/TP40014216-CH8-ID17.

Người ta có thể sử dụng một typealias trong Swift ở phạm vi toàn cầu:

typealias MYCLASS = MyClass 

Tất nhiên, typealias sẽ phải được sửa đổi nếu MYCLASS đã được tái định nghĩa trong tiêu đề.

Cách tiếp cận này không phải là rất hữu ích, không may, nếu định nghĩa của MYCLASS thay đổi tùy thuộc vào nơi/cách mã được xây dựng. Tuy nhiên, vì mã phải biết khá nhiều về hành vi chung cho các lớp khác nhau có thể được định nghĩa là MYCLASS, ví dụ, có thể sử dụng các giao thức ở đây.

UPDATE: Sau khi suy nghĩ về/chơi với nó một số chi tiết và đọc một số bài viết khác, ví dụ Using obj-c typedef in Swift, đây là giải pháp tốt hơn, tôi nghĩ vậy. Với cách tiếp cận này, bạn không cần thay đổi mã Swift nếu MYCLASS là re- #define d trong Mục tiêu-C.

Một nơi nào đó trong mã Mục tiêu-C của bạn, ví dụ: trong tiêu đề cầu nối, thêm

typedef MYCLASS * _MYCLASS; 

mà sau đó sẽ cho phép bạn làm những việc như sau trong Swift:

_MYCLASS.myClass().doStuff() 

Nếu bạn thực sự nhấn mạnh vào việc sử dụng MYCLASS trong Swift đối với một số lý do, thêm typealias MYCLASS = _MYCLASS trong mã Swift của bạn sẽ thực hiện thủ thuật.

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