我有一个快速对象,但是当我在Objective-C类中尝试使用它时,我得到'init' is unavailable
,为什么呢?
我的Swift类如下所示:
import Foundation
@objc public class OsonOptions : NSObject {
@objc var isWebview: Bool
@objc var key: String
@objc var token: String
@objc var products : Array<String>
var env: Environment
@objc var clientName: String
public init(isWebview: Bool,key: String,token: String,products:Array<String>,env: Environment,clientName: String) {
self.isWebview = isWebview
self.key = key
self.token = token
self.products = products
self.env = env
self.clientName = clientName
}
}
使用它的我的Objective-c类如下所示:
#import "MyFancyLibrary.h"
#import <OsonWidget/OsonWidget-Swift.h>
@implementation MyFancyLibrary
RCT_EXPORT_MODULE()
RCT_EXPORT_METHOD(greetings:(RCTResponseSenderBlock)callback){
OsonOptions *osonOptions = [[OsonOptions alloc] init];
NSString* someString = @"random";
callback(@[someString]);
}
@end
这是错误的代码行:OsonOptions *osonOptions = [[OsonOptions alloc] init];
答案 0 :(得分:1)
根据Swift初始化规则,创建实例时必须初始化所有属性。因此,默认的初始化器init()
不会暴露给ObjC。
您必须使用指定的初始化程序init(isWebview:key:token:products:env:clientName:)
或为所有属性分配默认值。
答案 1 :(得分:0)
@Oto有几个问题,为什么初始化程序在obj-c中不可见:
init
未标记为@objc
Environment
可能也无法在objc中表示只是一个例子:
// For the test purposes
@objc public class Environment: NSObject {}
@objc public class OsonOptions : NSObject {
@objc var isWebview: Bool
@objc var key: String
@objc var token: String
@objc var products : Array<String>
var env: Environment
@objc var clientName: String
@objc public init(isWebview: Bool,key: String,token: String,products:Array<String>,env: Environment,clientName: String) {
self.isWebview = isWebview
self.key = key
self.token = token
self.products = products
self.env = env
self.clientName = clientName
}
}
使用方式:
OsonOptions* oson = [[OsonOptions alloc] initWithIsWebview:YES
key:@"key"
token:@""
products:@[]
env:environment
clientName:@""];
如果您不能创建Environment
objc并继承NSObject
,则可以考虑创建另一个可以在objc中使用的类,例如EnvironmentInterop
或其他,然后可以将其转换为Environemnt对象
然后为了objc互操作性声明另一个init。
另一方面-由于不会初始化属性,因此无论如何都无法显示默认init
。因此,要么提供默认值并声明@objc init() {}
,要么我上面写的内容。