2015-01-04 24 views
7

Tôi có một dự án obj-c mà tôi đã thêm thành công một lớp Swift mới A, đang được sử dụng bởi một số lớp obj-c hiện có B - việc sử dụng tự động tạo ra Tiêu đề "MyProject-Swift.h" đã hoạt động như mong đợi.Lớp Swift sử dụng lớp Objective-C sử dụng lớp Swift

Tôi cũng đã thêm thành công một lớp Swift mới C sử dụng một số lớp obj-c hiện có D - việc sử dụng tiêu đề bắc cầu cũng hoạt động như mong đợi.

Tuy nhiên, giả sử tôi muốn tham khảo từ lớp Swift C của tôi đến lớp obj-c hiện tại B (lần lượt đề cập đến lớp Swift mới A). Để làm điều đó, tôi cần phải nhập "B.h" vào tiêu đề bắc cầu. Tuy nhiên, nếu tôi làm như vậy, tôi gặp lỗi trong lớp B: "Không tìm thấy tệp 'MyProject-Swift.h'" (tức là tệp không còn được tạo).

Tôi có làm gì sai hoặc đây có phải là loại tương tác giữa Swift và Objective-C không được phép không? Dường như có một loại tham chiếu vòng tròn mà trình biên dịch không thể giải quyết được.

--- EDIT ---

Tôi sẽ cố gắng làm cho câu hỏi rõ ràng hơn bằng cách thêm một số mã.

- LỜI NÓI ĐẦU -

Tôi đã thêm một lớp Swift mới cho một dự án obj-c:

// SwiftClassA.swift 
import Foundation 
@objc class SwiftClassA : NSObject { 
    var myProperty = 0 
} 

mã biên dịch một cách chính xác và được dịch sang obj-c khai trong tự động tạo ra " MyProject-Swift.h" tiêu đề như vậy:

// MyProject-Swift.h 
... 
SWIFT_CLASS("_TtC7MyProject11SwiftClassA") 
@interface SwiftClassA : NSObject 
@property (nonatomic) NSInteger myProperty; 
- (instancetype)init OBJC_DESIGNATED_INITIALIZER; 
@end 

Bây giờ, một lớp obj-c sử dụng SwiftClassA:

// ObjCClass.h 
#import <Foundation/Foundation.h> 
#import <MyProject-Swift.h> 
@interface ObjCClass : NSObject 
@property (nonatomic, strong) SwiftClassA *aProperty; 
@property (nonatomic) int *aNumber; 
@end 

Điều này cũng hoạt động liền mạch.

- CÁC CÂU HỎI -

Tôi có thể hiện nay tạo ra một lớp Swift mới mà đề cập đến lớp obj-c (ObjCClass) được sử dụng Swift lớp SwiftClassA?

Đây là những gì tôi không thể làm.

Nếu tôi thêm lớp Swift mới:

// SwiftClassB.swift 
import Foundation 
@objc class SwiftClassB : NSObject { 
    var aPropertyOfClassB = 1 
    func someFunc() { 
     var objCObject = ObjCClass() 
     var theProperty = objCObject.aProperty 
     print("The property is \(theProperty)") 
    } 
} 

này tất nhiên sẽ không biên dịch vì "Sử dụng định danh chưa được giải quyết 'ObjCClass'". Vì vậy, tôi cần phải nói thêm rằng đến tập tin tiêu đề bắc cầu:

// BridgingHeader.h 
#ifndef MyProject_BridgingHeader_h 
#define MyProject_BridgingHeader_h 
... 
#import "ObjCClass.h" 
#endif 

Tuy nhiên, nếu tôi làm điều đó, các tập tin ObjCClass.h sẽ không biên dịch đưa ra một " '-Swift.h MyProject' tập tin không tìm thấy".

Tôi đã đọc ở một vài nơi (không có ví dụ) rằng điều này có nghĩa là có tham chiếu vòng tròn và tham chiếu chuyển tiếp bằng @class có thể giải quyết được sự cố. Tuy nhiên, tôi không chắc chắn những gì cần phải được chuyển tiếp tham chiếu và ở đâu, và tất cả các nỗ lực của tôi không thành công.

Tôi hy vọng câu hỏi này không còn khó hiểu nữa!

+2

Tôi không nghĩ rằng câu hỏi này là ill-đặt ra hoặc không rõ ràng, và vấn đề là có thật và quan tâm thực sự (với tôi, ít nhất). Tôi không chống lại downvoting, nhưng bạn có thể xin vui lòng ít nhất cho tôi biết những gì sai với câu hỏi này? Nếu đó là bản sao, bản sao ở đâu? Nếu nó quá hiển nhiên, câu trả lời là gì? Cảm ơn – Maiaux

+0

Ở dạng hiện tại của nó, câu hỏi rất khó hiểu. –

+0

Câu hỏi này có vẻ hợp lý với tôi. –

Trả lời

11

Đây là vấn đề tham chiếu theo chu kỳ điển hình.

Hãy cẩn thận để đọc the docs:

Để tránh tài liệu tham khảo có tính chu kỳ, không nhập Swift vào một Objective-C tập tin tiêu đề. Thay vào đó, bạn có thể chuyển tiếp khai báo một lớp Swift để sử dụng nó trong một tiêu đề Objective-C. Lưu ý rằng bạn không thể phân lớp một lớp Swift trong Objective-C.

Vì vậy, bạn nên sử dụng "phía trước tuyên bố" trong .h#import trong .m:

// ObjCClass.h 
#import <Foundation/Foundation.h> 

@class SwiftClassA; 

@interface ObjCClass : NSObject 
@property (nonatomic, strong) SwiftClassA *aProperty; 
@property (nonatomic) int *aNumber; 
@end 
// ObjCClass.m 
#import "ObjCClass.h" 
#import "MyProject-Swift.h" 

@implementation ObjCClass 
// your code 
@end 
Các vấn đề liên quan