【问题标题】:mixing objective-c and swift when subclassing子类化时混合objective-c和swift
【发布时间】:2014-08-03 22:44:44
【问题描述】:

我有一个用 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 ... 行。

【问题讨论】:

  • 将新的超类写入现有类对我来说似乎有点奇怪...
  • 我认为OP的问题只是关于如何让一个Objective-C类扩展一个Swift类,这是不可能的

标签: ios objective-c swift


【解决方案1】:

这是一个编译错误,所以 U 不能在 objc 中子类化 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

【讨论】:

    【解决方案2】:

    【讨论】:

    • 谢谢!错过了 - 所以没有完全重写就没有办法慢慢地将新旧项目迁移到 Swift :)。
    • 你可以在 Swift 中继承一个 Objective-C 类。从底部开始,逐步向上。
    • 无需重写。您可以在 swift 中使用目标类,因为它正在使用目标 c 桥接头
    • @peri08: developer.apple.com/library/prerelease/ios/documentation/Swift/… "因为你不能在 Objective-C 中子类化 Swift 类,所以最好在你的应用程序中选择一个没有任何子类的类。"
    • @MatejUkmar 你可以在swift中使用你的ObjectiveC类。不需要重写它
    【解决方案3】:

    您不能在 Objective-C 中子类化 Swift 类。参看。接近尾声this section of the docs

    但是,请注意,您不能在 Objective-C 中子类化 Swift 类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多