繁体   English   中英

从 Objective C 中的 Swift 类继承

[英]Inherit from a Swift class in Objective C

我在 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 类可见,即#import ed:

#import "MyProject-Swift.h"

但是,您无法将 Swift 自动生成的桥接头导入 Obj-C .h文件。 您也不能使用@class向前声明不透明的超类。 那么,这是可能的吗?

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

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

有关使用 Objective-C 可以访问和不可以访问的内容的更多详细信息,请参阅 Apple 的互操作性指南

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

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

斯威夫特班。

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

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

其实可以通过类来实现:

SWIFT代码

import UIKit

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

目标 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM