【问题标题】:In objective-c generics can i pass the type from 1 class to another在objective-c泛型中,我可以将类型从一个类传递给另一个类吗
【发布时间】:2016-02-18 03:24:39
【问题描述】:

我想做的例子是

@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 分配与分配 B 相同的类型。

** 中的行不会编译。执行此类操作的正确语法是什么?

【问题讨论】:

  • 不熟悉 Obj-C 中的泛型,但需要看看。检查这篇文章表明您在实现中缺少通用括号内的指针:A&lt;ObjectType *&gt; *adrekka.ghost.io/objective-c-generics

标签: ios objective-c iphone swift generics


【解决方案1】:

Objective-C没有有泛型,Apple 引入了他们称之为轻量级泛型的东西,你可以将“轻量级”读作“假”。

这是 Apple 自己对他们所做工作的声明:

允许您指定集合类的类型信息,例如 NSArray、NSSet 和 NSDictionary。当您从 Objective-C 桥接时,类型信息改进了 Swift 访问并简化了您必须编写的代码。

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

您可以在@interface 中使用轻量级泛型注释 (a) 和 (b) 在声明类型具有轻量级泛型注释的变量时。您不能以其他方式使用注释,特别是您不在上述 (b) 之外的 @implementation 中使用它们。在 @implementation 中为轻量级泛型注解 @interface 而不是使用注解中的“类型参数”,您使用 id 类型 - 正如您使用 doSomething: 方法所做的那样。

最新的 Xcode/Clang 将在 Objective-C 中提供一些轻量级泛型注解的检查,但它是有限的,不应被视为检查泛型条件的保证。

总而言之,除非您打算使用 Objective-C 中的轻量级泛型注解与 Swift 交互,否则几乎没有什么好处,而且它肯定不会为您提供通常意义上的“泛型”(即参数泛型类型)。

无疑不是你想听到的,而是 HTH

【讨论】:

    【解决方案2】:

    这适合你吗?

    @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
    

    【讨论】:

    • 您的答案使用的是 Objective-C protocols,而不是 OP 询问的 Objective-C(伪)generics
    猜你喜欢
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多