【问题标题】:Initialize generic parameters in iOS在 iOS 中初始化泛型参数
【发布时间】:2016-06-19 13:47:09
【问题描述】:

我想用默认初始化器创建泛型属性的对象。我知道这可以通过在 MyProtocol 中添加一个 init 方法来快速实现。有什么方法可以在目标 c 中实现此功能

界面

@interface CustomClass<__covariant T:id<MyProtocol>> : NSObject

@property(nonatomic) T result;

-(void) update;

@end

实施

#import "CustomClass.h"

@implementation CustomClass

-(void) update
{
    //self.result = initialize result here

    [self.result myMethod];
 }

@end

【问题讨论】:

    标签: ios objective-c generics


    【解决方案1】:

    Objective-C 是后期绑定和动态类型。您既不需要模板(哎呀,他们称之为泛型)也不需要编译器绑定到它。只需使用id

    @interface CustomClass : NSObject
    @property(nonatomic) id result;
    -(void) update;
    @end
    
    -(void) update
    {
      //self.result = initialize result here
      [self.result myMethod];
    }
    

    如果您出于某种原因想要对类型进行约束,只需使用协议:

    @protocol CustomProtocol
    - (void)myMethod;
    @end 
    
    @interface CustomClass : NSObject
    @property(nonatomic) id<MyProtocol> result;
    -(void) update;
    @end
    
    -(void) update
    {
      //self.result = initialize result here
      [self.result myMethod];
    }
    

    在cmets中讨论过这个主题:

    如果要实例化泛型类型,则不要在编译时执行此操作,而只需在运行时将类型传递给初始化程序。

    而不是……:

    var concrete = CustomClass<Concrete>()
    

    ……你写:

    CustomClass *concrete = [[CustomClass alloc] initForType:[Concrete class]];
    

    我个人更喜欢新的分配器,但这是另一个讨论。您也可以将类型名称作为字符串传递。我个人也不喜欢这样。 :-)

    初始化程序如下所示:

    - (instancetype)initForType:(Class)type
    {
      if( (self = [super init] )
      {
        self.result = [type new];
      }
      return self;
    }
    

    【讨论】:

    • ?我真的不知道,你想分配什么。您应该分配一个实例,而不是一个类型。只需使用 setter 将值放在那里。当CustomClass 被初始化时,result 是否应该是私有和初始化的?
    • 我想在CustomClass初始化的时候初始化result。我知道我可以初始化它并将其传递给 CustomClass。我想知道我是否可以在 CustomClass 中初始化结果
    • 好的,你不知道如何将类型传递给初始化器,这将在 Swift 中通过实例化模板来完成?您只需在运行时传递它。添加代码。
    【解决方案2】:

    Objective-C 中的轻量级泛型是一种纯粹的编译时构造,用于帮助进行类型检查。它们在类型检查后被擦除,并且不存在于编译代码中。运行时没有T。你不能编写任何需要知道T 是什么的代码。

    【讨论】:

      猜你喜欢
      • 2019-03-16
      • 2015-03-22
      • 2014-04-05
      • 1970-01-01
      • 2019-10-06
      • 1970-01-01
      • 2010-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多