如何在Swift中调用Objective-C的instancetype方法?

4

我有一个 Objective-C 类长这样:

@interface CustomObjectHavingData : NSObject
@property (nonatomic, strong) NSData *objWithData;
 - (instancetype)initWithObjHavingData;
@end

和这样的实现方式

@implementation CustomObjectHavingData
- (instancetype)initWithObjHavingData{
if (self = [super init]) {
    NSString *str = @"This is simple string.";
    self.objWithData = [str dataUsingEncoding:NSUTF8StringEncoding];
}
return self;
}
@end

现在我想在Swift中调用这个initWithObjHavingData。
var objData = CustomObjectHavingData()

这对我来说返回了nil。请帮忙解决如何在此处调用上述的init方法。

请查看此链接:https://dev59.com/f2Ag5IYBdhLWcg3wE3nQ - Mrunal
3个回答

9

在Objective C中,你不应该像那样编写初始化程序。要么只用init,要么如果你正在构造函数中传递参数,则可以命名它。

以下是如何操作:

@interface CustomObjectHavingData : NSObject

@property (nonatomic, strong) NSData *objWithData;

- (instancetype)initWithObjHavingData:(NSData *)data;

@end


@implementation CustomObjectHavingData

- (instancetype)initWithObjHavingData:(NSData *)data
{
    if (self = [super init]) {
        _objWithData = data;
    }

    return self;
}

@end

在Swift中,您可以像这样简单地调用它:
  let myCustomObject = CustomObjectHavingData(objHavingData: someData)

这个名字并不太合适。

1
看起来这个桥接方式有些奇怪。据我所知,CustomObjectHavingData(objHavingData: ()) 是使用 OP 提供的初始化器的有效方法,但是你提供的初始化器当然更加合适。 - Mick MacCallum
是的,这可能是由于为Swift类生成的奇怪默认命名参数所致。您知道是否可以从Swift类中删除命名参数,例如init(_ data)。 - Sandeep
没错,据我所知,无法通过以这种方式创建的初始化程序来完成,但我可能忽略了某些东西。 - Mick MacCallum
现在,我不明白你的问题。你想让 Objective C 类与 Swift 兼容,还是你想做什么? - Sandeep
1
@DhvaniPuar 你应该使用类方法而不是实例方法来完成这个任务。 - nhgrif
显示剩余4条评论

1
如果您想按照我在问题中发布的要求调用不带任何参数的init方法,我们必须像这样编写init方法:
@interface CustomObjectHavingData : NSObject

@property (nonatomic, strong) NSData *objWithData;

- (id)init;
@end

并像这样实现它。
@implementation CustomObjectHavingData
- (instancetype)initWithObjHavingData{
if (self = [super init]) {
  NSString *str = @"This is simple string.";
  self.objWithData = [str dataUsingEncoding:NSUTF8StringEncoding];
}
return self;
}
@end

@implementation CustomObjectHavingData

- (instancetype)initWithObjHavingData:(NSData *)data
{
  if (self = [super init]) {
     _objWithData = data;
  }

  return self;
}

@end

然后,您可以像这样从Swift调用它:
var objData = CustomObjectHavingData()

默认情况下,它将初始化所有对象。

0

你可以使用这个:

+ (Common *)sharedInstance
{

    static Common *sharedInstance_ = nil;
    static dispatch_once_t pred;

    dispatch_once(&pred, ^{
        sharedInstance_ = [[Common alloc] init];
    });   
    return sharedInstance_;
}

接下来是调用:

var com_obj: Common!

com_obj = Common.sharedInstance() com_obj.anyfunc(..)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接