尝试在Objective-C类中使用Swift对象时,'init'不可用

时间:2019-12-04 12:07:05

标签: objective-c swift

我有一个快速对象,但是当我在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];

2 个答案:

答案 0 :(得分:1)

根据Swift初始化规则,创建实例时必须初始化所有属性。因此,默认的初始化器init()不会暴露给ObjC。

您必须使用指定的初始化程序init(isWebview:key:token:products:env:clientName:)或为所有属性分配默认值。

答案 1 :(得分:0)

@Oto有几个问题,为什么初始化程序在obj-c中不可见:

  1. init未标记为@objc
  2. 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() {},要么我上面写的内容。