Tôi đang làm việc trên một cơ sở mã lớn hiện có mà chủ yếu là Objective-C nhưng đang trong quá trình chuyển đổi sang Swift.Nhập vòng tròn Swift/ObjC
Các lớp mới đang được triển khai trong Swift, nhưng một số lớp này cần được truy cập từ mã ObjC hiện có. Trong một nỗ lực để làm theo cả hai thực hành tốt nhất ObjC và Swift, các lớp mới không có tiền tố, nhưng được định nghĩa với tiền tố cho ObjC.
/**
Create contrived class that is named XXClassA in ObjC and ClassA in Swift.
*/
@objc(XXClassA) class ClassA: NSObject {
let foo = "bar"
}
Cho đến nay điều này đã hoạt động rất tốt; Mã Swift sử dụng ClassA()
và ObjC sử dụng [[XXClassA alloc] init]
. Khi tất cả mã ObjC tham chiếu đến XXClassA bị xóa, @objc(XXClassA)
cũng có thể bị xóa khỏi lớp Swift.
Thật không may điều này bị hỏng nếu bạn có tham chiếu lớp ObjC XXClassA và sau đó mã Swift cố gắng sử dụng lớp mới đó bên trong ClassA.
Giả sử tôi có thể tạo một lớp ObjC, tên XXClassC
và nó instantiates tự sử dụng một XXClassA
(mà thực sự là lớp Swift ClassA
)
//
// XXClassC.h
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@class XXClassA;
@interface XXClassC : NSObject
-(instancetype)initWithA:(XXClassA *)classA;
@end
NS_ASSUME_NONNULL_END
Các tham chiếu vòng tròn tại là tại chỗ. Nếu tôi cố gắng sử dụng XXClassC từ bên trong ClassA, bộ khởi tạo không có sẵn.
Nếu tôi xác định lại ClassA như thế này thay vào đó, tất cả là tốt nữa.
class XXClassA: NSObject {
let foo = "bar"
}
Tôi hiểu tại sao điều này xảy ra và khắc phục sự cố tôi có, tuy nhiên tôi muốn tiếp tục sử dụng mẫu tiền tố ObjC này. Bất kỳ ý tưởng nào về cách tránh nhập vòng tròn, mà còn giữ quy ước đặt tên?
Mẫu mã đầy đủ tại đây: https://gist.github.com/justAnotherDev/78483f9d94e40fd90c38