2015-04-17 15 views
10

Ý định của tôi là tạo ra một lớp chung trong Swift mà phù hợp với một giao thức Objective-C:Swift Generic Class thực hiện một Objective-C Nghị định thư

Lớp là:

class BaseViewFactoryImpl<T> : NSObject, BaseView { 
    func getNativeInstance() -> AnyObject { 
    return String("fsd") 
    } 
} 

Giao thức BaseView là :

@protocol BaseView <NSObject> 

- (id)getNativeInstance; 

@end 

Trình biên dịch nói với tôi:

Type 'BaseViewFactoryImpl<T>' does not conform to protocol 'BaseView' 

Nếu tôi xóa <T> thì không có lỗi.

Có gì sai ở đây? Làm cách nào để tôi có thể thực hiện đúng lớp chung?

+5

Nó chỉ là không thể với các lớp học chung chung, xem http://stackoverflow.com/questions/26097581/generic-nsoperation-subclass-loses-nsoperation-functionality cho một vấn đề tương tự. –

Trả lời

0

Nếu bạn tạo mô hình chế độ xem chung mới, khi bạn cố gắng tạo bất kỳ lớp con nào của mô hình chế độ xem chung, bạn cũng cần khai báo lớp con làm lớp chung. Đó là loại khó chịu.

Đối với một cách tốt hơn, bạn có thể sử dụng typealias để khai báo kiểu của dụ thay vì sử dụng chung:

protocol BaseView { 
    typealias T 
    func getNativeInstance() -> T! 
} 

class StringViewModel : BaseView { 

    typealias T = String 

    func getNativeInstance() -> String! { 
     return T() 
    } 

} 
0

//BaseViewFactory.swift

class BaseViewFactoryImpl<T> : NSObject, BaseView { 
    func getNativeInstance() -> AnyObject { 
     return String("fsd") 
    } 

//BaseViewProtocol.h

@protocol BaseView <NSObject> 

- (id)getNativeInstance; 

@end 

//BridgingHeader.h

#import "BaseClassProtocol.h" 

Mã của bạn sẽ hoạt động. Bạn đã tạo tiêu đề bắc cầu để nhập tệp giao thức obj-C chưa?

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