【问题标题】:How to call Objective-C instancetype method in Swift?如何在 Swift 中调用 Objective-C 实例类型方法?
【发布时间】:2015-05-26 13:16:35
【问题描述】:

我有一个如下所示的 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 给我。请帮助我如何在这里调用上述初始化方法。

【问题讨论】:

标签: ios objective-c swift


【解决方案1】:

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

你可以这样做,

@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)

这个名字很不合适。

【讨论】:

  • 看起来这很奇怪。据我所知,CustomObjectHavingData(objHavingData: ()) 是使用提供的初始化程序 OP 的有效方式,但您提供的初始化程序当然更合适。
  • 是的,这可能是因为为 Swift 类生成的奇怪的默认命名参数。你知道是否可以从 swift class 中删除命名参数,比如 init(_ data)。
  • 对,据我所知,不能通过这种方式创建的初始化程序来完成,但我可能忽略了一些东西。
  • 但是如果我不想像这样在构造函数中传递任何参数怎么办。我只想在调用此构造函数后立即对测试字符串进行编码。
  • @DhvaniPuar 你应该使用类方法,而不是实例方法。
【解决方案2】:

如果你想按照我在问题中发布的要求调用不带任何参数的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()

默认情况下会初始化所有对象。

【讨论】:

    【解决方案3】:

    你可以用这个:

    + (Common *)sharedInstance
    {
    
        static Common *sharedInstance_ = nil;
        static dispatch_once_t pred;
    
        dispatch_once(&pred, ^{
            sharedInstance_ = [[Common alloc] init];
        });   
        return sharedInstance_;
    }
    

    之后调用

    var com_obj : 常见!

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-23
      • 1970-01-01
      相关资源
      最近更新 更多