混合使用Objective-C和Swift进行子类化

56

我有一个用Swift编写的UIViewController子类,名为'BaseViewController'。现在我有一个旧的Objective-C视图控制器,名为'ViewController1',我想从'BaseViewController'继承它。根据其他建议,我已经导入了'Project-Swift.h'头文件。

当像这样创建子类时,我的问题出现了。

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

@interface ViewController1 : BaseViewController
@end

错误信息为:

无法以objc_subclassing-restricted属性子类化一个类

并且它出现在@interface ...行中。


对我来说,在现有类中编写一个新的超类似乎有点奇怪... - nhgrif
我认为OP的问题只是关于如何使Objective-C类扩展Swift类,这是不可能的。 - Craig Otis
3个回答

90

3
谢谢!我没注意到这一点——那么就没有办法在不完全重写的情况下逐步迁移旧的和新的项目到 Swift 中了 :). - apotry
2
你可以在Swift中对Objective-C类进行子类化。从底层开始,逐步向上构建。 - nhgrif
1
非常失望...所以唯一的方法就是用Swift重写我的现有ObjC类...双倍的工作啊...我希望这种情况不会在太多情况下再次发生。 - Matej Ukmar
2
@MatejUkmar 你可以在Swift中使用你的ObjectiveC类,无需重写它。 - Anil Varghese
1
@NicolasMiari A) 无论继承树如何,任何在.swift文件中定义的类 - Anil Varghese
显示剩余8条评论

10

无法在Objective-C中子类化Swift类。请参考文档结尾处的此部分

但是,请注意,您无法在Objective-C中对Swift类进行子类化。


0

这是一个编译错误,所以您不能在 Objective-C 中对 Swift 类进行子类化。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接