2014-06-07 15 views
6

Tôi có một sub-class của TyphoonAssembly, trong đó có phương pháp nhà máy này:Tạo dụ Swift từ phương pháp nhà máy Objective-C

+ (instancetype)assembly; 

Tôi đang cố gắng sử dụng nó trong một thử nghiệm như sau:

var assembly : ApplicationAssembly! = ApplicationAssembly.assembly() 

Nhưng nhận lỗi 'assembly() không khả dụng' (xem hình ảnh).

Cách chính xác để tạo cá thể Swift từ phương thức lớp mục tiêu-C là gì.

enter image description here

+0

Tôi đã gặp phải vấn đề tương tự. Thay vì sử dụng thông số giả, bạn có thể thay đổi tên phương thức tĩnh của mình. Ví dụ: + (instancetype) sharedInstance; đi qua cây cầu. – kokluch

Trả lời

4

Khi cầu nối mã từ khách quan-C để nhanh chóng trình biên dịch cố gắng để chuyển đổi phương thức lớp nhà xây dựng để initializers bình thường. Thử gọi hàm ApplicationAssembly() và xem nó có gọi phương thức lớp của bạn hay không. Bạn cũng có thể thay đổi tên của phương thức lớp của bạn để trình biên dịch không nhận ra nó như là một tên hàm dựng chung.

Dưới đây là một ví dụ về một cây cầu hoạt động:

// Objective-C 
@implementation ApplicationAssembly 

+ (instancetype)assemblyWithValue:(NSString *)value 
{ 
    ApplicationAssembly *new = [[self alloc] init]; 
    new.value = @"Some_Value_To_Make_Sure_That_This_Code_Is_Running"; 
    return new; 
} 

@end 

// Swift 
var assembly = ApplicationAssembly(value: "") 
println(assembly.value) // outputs "Some_Value_To_Make_Sure_That_This_Code_Is_Running" 

Nó không làm việc với một nhà xây dựng phương pháp lớp học trống như bạn đang cố gắng truy cập.

+0

Gọi ApplicationAssembly() đi thẳng đến init, thực sự là riêng tư, vì phương thức lớp đã thực hiện thêm một số cấu hình trước khi trở về. . . may mắn là cấu hình phụ có thể được chuyển đến init một cách an toàn. . . Không chắc chắn phải làm gì nếu a) Không phải là một lớp ObjC mà tôi kiểm soát hoặc b) Nó không thể di chuyển được. –

+0

@ JasperBlues Ya Tôi không chắc chắn. Tôi đã làm một số thử nghiệm và tôi không thể tìm thấy một initializer mà sẽ gọi phương thức lớp học – drewag

+0

Lưu ý phụ: 'mới' có lẽ là tốt nhất còn lại cho' [MyClass new] 'là viết tắt của' [[MyClass alloc] init] '. –

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