【问题标题】:Inherit from a Swift class in Objective C从 Objective C 中的 Swift 类继承
【发布时间】:2016-05-16 15:17:07
【问题描述】:

我在 Xcode 7 项目中成功混合和匹配 Obj-C 和 Swift。但是,我似乎无法弄清楚如何在 Objective C 类中从 Swift 类继承(是的,我知道将 Swift 类声明为 @objc 以提高可见性)。在这种情况下,所需的 Swift 超类 MySwiftViewControllerUIViewController 的子类。目前,在 Obj-C 中,我直接从 UIViewController 继承,并且无法访问我在 MySwiftViewController 中添加的功能。

这是我的理解:

-- 声明一个 Obj-C 类继承自某个东西,它必须在 .h 文件中的 ':' 之后:

#import <UIKit/UIKit.h>
@interface RootViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>
@end

-- 让 Swift 类可见,即#imported:

#import "MyProject-Swift.h"

但是,您不能将 Swift 自动生成的桥接头导入到 Obj-C .h 文件中。你也不能用@class 前向声明一个不透明的超类。那么,这是否可能以及如何实现?

【问题讨论】:

    标签: ios objective-c swift inheritance


    【解决方案1】:

    其实可以通过分类来实现:

    Swift 代码

    import UIKit
    
    @objc open class TestModel: NSObject {
        @objc var testName: String = String()
    }
    

    Objective C .h 文件代码

    #import <Foundation/Foundation.h>
    
    #import "Test-Swift.h"
    
    
    @interface TestModel (Add)
    - (void)configTestName;
    @end
    
    

    Objective C .m 文件代码

    #import "TestModel+Add.h"
    
    @implementation TestModel (Add)
    
    - (void)configTestName {
        self.testName = @"12323";
    }
    
    @end
    

    【讨论】:

      【解决方案2】:

      至于 Xcode 8.0 及更早的版本,有一个很脏的解决方案,将来可能会修复。

      如果你想从 swift 文件子类化,你可以添加objc_subclassing_restricted 属性。为方便起见,您可以将其设为宏。 代码:

      Swift 类。

      import Foundation
      
      class SwiftClass : NSObject {
        func say() {
          print("hi");
        }
      }
      

      对象类:

      #import <Foundation/Foundation.h>
      
      #import "test-Swift.h"
      
      #define SWIFT_SUBCLASS __attribute__((objc_subclassing_restricted))
      
      SWIFT_SUBCLASS
      @interface ObjcClass : SwiftClass
      - (instancetype)init;
      @end
      @implementation ObjcClass
      - (void)say {
        NSLog(@"oops");
      }
      @end
      

      但是,据我了解,它不受支持,并且您可能因此遇到任何类型的错误。因此它不是行动指南,更像是好奇的事情。

      【讨论】:

      • 我可以确认此解决方法在 Xcode 8.1 上成功编译,但该类不存在,因此在链接器阶段构建失败。
      • 你能提供更具体的例子吗?我只是在 Xcode 8.2.1 上构建并运行上面的代码。它运行良好,甚至更多[[ObjcClass alloc] init] say] 打印出“oops”而没有任何错误。
      • 在 Xcode 8.3.2 上不适合我。在@implementation 行上得到“不能子类化”错误(没有属性,我已经在@interface 行上得到它)
      【解决方案3】:

      不幸的是,在 Objective-C 中子类化 Swift 类是不可能的。直接来自文档:

      你不能在 Objective-C 中继承一个 Swift 类。

      请参阅 Apple 的 guide on interoperability,了解有关使用 Objective-C 可以访问和不能访问的更多详细信息。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-31
      • 1970-01-01
      • 1970-01-01
      • 2013-09-26
      • 1970-01-01
      • 2012-03-10
      相关资源
      最近更新 更多