2016-02-23 31 views
6

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.

enter image description here

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

Trả lời

0

Tôi đang gặp vấn đề tương tự. Giải pháp của tôi là:

  • Sử dụng tên tiền tố theo phong cách objc cho lớp Swift.
  • Thêm typealias: typealias ClassA = XXClassA.
  • Luôn sử dụng tên không được cố định từ mã Swift.

Với mẫu này, ít nhất cũng dễ dàng loại bỏ tiền tố khi phụ thuộc objc cuối cùng biến mất.