Câu hỏi trộn mục tiêu-c và nhanh chóng khi phân lớp


Tôi đã có một lớp con của UIViewController viết bằng Swift gọi là 'BaseViewController'. Bây giờ tôi có một bộ điều khiển xem 'cũ' được gọi là 'ViewController1' được viết trong Objective-C mà tôi muốn kế thừa từ 'BaseViewController'. Theo lời khuyên khác, tôi đã nhập tệp tiêu đề 'Project-Swift.h'.

Vấn đề của tôi xảy ra khi phân lớp như thế này

#import <UIKit/UIKit.h>
#import "MyProject-Swift.h"

@interface ViewController1 : BaseViewController
@end

Lỗi này là:

Không thể phân lớp một lớp với thuộc tính objc_subclassing-restricted

và nó xuất hiện trên dòng @interface ....


50
2018-06-13 11:26


gốc


Viết một siêu lớp mới cho một lớp học hiện tại có vẻ hơi lạ với tôi ... - nhgrif
Tôi nghĩ câu hỏi của OP chỉ là về cách để có một lớp Objective-C mở rộng một lớp Swift, điều không thể thực hiện được - Craig Otis


Các câu trả lời:


Bạn không thể phân lớp một lớp Swift trong Objective-C.

Đoạn trích từ Sử dụng Swift với Cocoa và Objective-C


86
2018-06-13 11:30



Cảm ơn! Bỏ lỡ điều đó - vì vậy không có cách nào để từ từ di chuyển các dự án cũ và mới sang Swift mà không cần viết lại hoàn toàn :). - apotry
Bạn có thể phân lớp một lớp Objective-C trong Swift. Bắt đầu từ phía dưới và làm việc theo cách của bạn lên. - nhgrif
Không cần phải viết lại nó. Bạn có thể sử dụng lớp khách quan nhanh chóng vì nó đang sử dụng tiêu đề cầu nối c mục tiêu - Anil Varghese
@ peri08: developer.apple.com/library/prerelease/ios/documentation/Swift/… "Vì bạn không thể phân lớp lớp Swift trong Mục tiêu-C, tốt nhất nên chọn một lớp trong ứng dụng của bạn không có bất kỳ lớp con nào." - user102008
@MatejUkmar Bạn có thể sử dụng lớp ObjectiveC của bạn nhanh chóng.Nó không cần phải viết lại nó - Anil Varghese


Bạn không thể phân lớp một lớp Swift trong Objective-C. cf. vê phía cuối của phần này của tài liệu:

Tuy nhiên, lưu ý rằng bạn không thể phân lớp một lớp Swift trong Objective-C.


9
2018-06-13 11:30





Đó là một lỗi biên dịch, vì vậy U không thể phân lớp một lớp nhanh trong objc.

SWIFT_CLASS("_TtC6Swifty14ViewController")
@interface ViewController : UIViewController
@end


# if defined(__has_attribute) && __has_attribute(objc_subclassing_restricted)
#  define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA
#  define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
# else
#  define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
#  define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
# endif
#endif

0
2017-07-13 06:48