Ios 在objective-c泛型中,我可以将类型从一个类传递到另一个类吗

Ios 在objective-c泛型中,我可以将类型从一个类传递到另一个类吗,ios,objective-c,iphone,swift,generics,Ios,Objective C,Iphone,Swift,Generics,我想做的例子是 @interface A<ObjectType> : NSObject @end @interface B<ObjectType> : NSObject - (void)doSomething:(ObjectType)obj; @end @implementation B - (void)doSomething:(id)obj { **A<ObjectType> *a = [[A alloc] init];** [a addObje

我想做的例子是

@interface A<ObjectType> : NSObject
@end
@interface B<ObjectType> : NSObject
- (void)doSomething:(ObjectType)obj;
@end
@implementation B
- (void)doSomething:(id)obj {
   **A<ObjectType> *a = [[A alloc] init];**
   [a addObject:obj];
}
@end
@接口A:NSObject
@结束
@接口B:NSObject
-(void)doSomething:(ObjectType)obj;
@结束
@实施B
-(无效)剂量:(id)obj{
**A*A=[[A alloc]init]**
[a addObject:obj];
}
@结束
基本上,我希望A与B分配的类型相同

**中的行无法编译。这样做的正确语法是什么?

这样对您合适吗

@protocol ObjectType <NSObject>

- (void)addObject:(id)obj;


@end

@interface A : NSObject <ObjectType>


@end

@implementation A

- (void)addObject:(id)obj {

}

@end
@interface B : NSObject <ObjectType>


- (void)doSomething:(id<ObjectType>)obj;
@end
@implementation B

- (void)addObject:(id)obj {

}

- (void)doSomething:(id)obj {
    id<ObjectType> a = [[A alloc] init];
    [a addObject:obj];
}

@end
@协议对象类型
-(void)addObject:(id)obj;
@结束
@接口A:NSObject
@结束
@实施A
-(void)addObject:(id)obj{
}
@结束
@接口B:NSObject
-(无效)剂量测定:(id)obj;
@结束
@实施B
-(void)addObject:(id)obj{
}
-(无效)剂量:(id)obj{
id a=[[a alloc]init];
[a addObject:obj];
}
@结束
这对您合适吗

@protocol ObjectType <NSObject>

- (void)addObject:(id)obj;


@end

@interface A : NSObject <ObjectType>


@end

@implementation A

- (void)addObject:(id)obj {

}

@end
@interface B : NSObject <ObjectType>


- (void)doSomething:(id<ObjectType>)obj;
@end
@implementation B

- (void)addObject:(id)obj {

}

- (void)doSomething:(id)obj {
    id<ObjectType> a = [[A alloc] init];
    [a addObject:obj];
}

@end
@协议对象类型
-(void)addObject:(id)obj;
@结束
@接口A:NSObject
@结束
@实施A
-(void)addObject:(id)obj{
}
@结束
@接口B:NSObject
-(无效)剂量测定:(id)obj;
@结束
@实施B
-(void)addObject:(id)obj{
}
-(无效)剂量:(id)obj{
id a=[[a alloc]init];
[a addObject:obj];
}
@结束

Objective-C确实没有仿制药,苹果推出了一些他们称之为轻量级仿制药的产品,你可能会将“轻量级”理解为“人造”

以下是苹果公司自己关于他们所做工作的声明:

允许您为集合类(如NSArray、NSSet和NSDictionary)指定类型信息。类型信息提高了从Objective-C桥接时的快速访问,并简化了必须编写的代码

注意“改进快速访问”和缺少“改进目标C”。这些轻量级泛型本质上是Swift编译器在导入Objective-C类型时的注释。在Objective-C方面,维护泛型不变量主要是程序员的责任

您可以在
@接口中使用轻量级泛型注释(a)和(b)在声明类型具有轻量级泛型注释的变量时使用轻量级泛型注释。您不能以其他方式使用注释,尤其是在上述(b)以外的
@实现中不使用注释。在轻量级泛型注释
@接口的
@实现中
,而不是使用注释中的“类型参数”,您使用
id
类型-就像您使用
doSomething:
方法所做的那样

最新的Xcode/Clang将在Objective-C中提供一些轻量级泛型注释的检查,但它是有限的,不应以任何方式作为检查泛型条件的保证

总之,除非您计划在Objective-C中使用轻量级泛型注释与Swift进行交互,否则没有什么好处,而且它肯定不会提供通常意义上的“泛型”(即参数泛型类型)


毫无疑问,这不是你想听到的,但是HTH

Objective-C确实没有仿制药,苹果推出了一些他们称之为轻量级仿制药的产品,你可能会把“轻量级”理解为“人造”

以下是苹果公司自己关于他们所做工作的声明:

允许您为集合类(如NSArray、NSSet和NSDictionary)指定类型信息。类型信息提高了从Objective-C桥接时的快速访问,并简化了必须编写的代码

注意“改进快速访问”和缺少“改进目标C”。这些轻量级泛型本质上是Swift编译器在导入Objective-C类型时的注释。在Objective-C方面,维护泛型不变量主要是程序员的责任

您可以在
@接口中使用轻量级泛型注释(a)和(b)在声明类型具有轻量级泛型注释的变量时使用轻量级泛型注释。您不能以其他方式使用注释,尤其是在上述(b)以外的
@实现中不使用注释。在轻量级泛型注释
@接口的
@实现中
,而不是使用注释中的“类型参数”,您使用
id
类型-就像您使用
doSomething:
方法所做的那样

最新的Xcode/Clang将在Objective-C中提供一些轻量级泛型注释的检查,但它是有限的,不应以任何方式作为检查泛型条件的保证

总之,除非您计划在Objective-C中使用轻量级泛型注释与Swift进行交互,否则没有什么好处,而且它肯定不会提供通常意义上的“泛型”(即参数泛型类型)


毫无疑问,这不是您想要听到的,但是HTH

不熟悉Obj-C中的w/泛型,但需要看一看。检查这篇文章表明您在实现中的泛型括号中缺少一个指针:
a*a
不熟悉Obj-C中的泛型,但需要查看一下。检查这篇文章表明您在实现中的通用括号中缺少一个指针:
a*a
您的答案使用Objective-C协议,而不是OP询问的Objective-C(伪)泛型。您的答案使用Objective-C协议,而不是OP询问的Objective-C(伪)泛型。