如何在 Objective C 中调用 +class 方法而不引用该类?

2023-11-24

我有一系列“策略”对象,我认为将它们作为一组策略类上的类方法来实现很方便。我为此指定了一个协议,并创建了符合的类(下面仅显示一个)

@protocol Counter   
+(NSInteger) countFor: (Model *)model;
@end

@interface CurrentListCounter : NSObject <Counter> 
+(NSInteger) countFor: (Model *)model;
@end

然后我有一个符合该协议的类数组(就像 CurrentListCounter 那样)

+(NSArray *) availableCounters {
return [[[NSArray alloc] initWithObjects: [CurrentListCounter class], [AllListsCounter class], nil] autorelease];
}

请注意我如何使用像对象这样的类(这可能是我的问题 - 在 Smalltalk 中,类是像其他所有东西一样的对象 - 我不确定它们是否在 Objective-C 中?)

我的确切问题是,当我从数组中取出策略对象之一时想要调用该方法:

id<Counter> counter = [[MyModel availableCounters] objectAtIndex: self.index];
return [counter countFor: self];

我在 return 语句上收到警告 - 它说 -countFor: not find in protocol (因此它假设它是一个我想调用类方法的实例方法)。然而,由于我的数组中的对象是类的实例,它们现在就像实例方法(或者从概念上讲它们应该是)。

有没有一种神奇的方法来调用类方法?或者这只是一个坏主意,我应该只创建策略对象的实例(而不是使用类方法)?


This

id <Counter> counter = [[Model availableCounters] objectAtIndex:0];
return ( [counter countFor: nil] );

应该

Class <Counter> counter = [[Model availableCounters] objectAtIndex:0];
return ( [counter countFor: nil] );

首先,您有一个符合以下条件的实例<Counter>。在第二个中,你有一个符合以下条件的类<Counter>。编译器警告是正确的,因为符合以下条件的实例<Counter>不回应countFor:,只有类可以。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Objective C 中调用 +class 方法而不引用该类? 的相关文章

随机推荐

  • 为什么我无法克隆我作为协作者的私有存储库

    我是一个私人 github 存储库的合作者 我可以分叉它 但是当我尝试将它克隆到我的系统上时 它会显示一个弹出框 要求提供凭据 即使我输入正确的凭据 我也无法登录 是只有我一个人还是 github 实际上不允许克隆私人仓库 即使我是其中的合
  • 在 Windows 上启动 Git Bash 时运行 SSH 代理

    我正在使用 git bash 我必须使用 eval ssh agent exe ssh add my ssh location 每次当我开始一个新的 git bash 时 有没有办法永久设置ssh代理 或者windows有什么好的办法吗 管
  • 对字符串的迭代器进行排序

    我有一个字符串迭代器 为了排序 我需要从中创建一个列表并使用它对其进行排序Collections sort list 有没有简单的方法来对迭代器进行排序 迭代器不是容器 它是遍历容器元素的实用程序 因此 如果您只能访问迭代器 则无法更改由该
  • 从字符串中分离出整数

    假设我有一个网页 当前通过 url 参数接受单个 ID 值 http example com mypage aspx ID 1234 我想改变它以接受listid 像这样 http example com mypage aspx IDs 1
  • Spring Data JPA 调用 Oracle 函数

    我正在运行一个简单的应用程序 它使用 Spring Boot Spring Data JPA 来实现持久性 下面是一个示例 Oracle 函数 我希望在服务实现类中返回值 CREATE OR REPLACE PACKAGE PKG TEST
  • 我正在尝试计算 txt 文件中的所有字母,然后按降序显示

    正如标题所说 到目前为止 这就是我的代码确实可以工作的地方 但是我无法按顺序显示信息 目前它只是随机显示信息 def frequencies filename infile open filename r wordcount content
  • 使用 matplotlib 绘制 PNG 文件时反转颜色

    I m trying to display a PNG file using matplotlib and of course python For this test I ve generated the following image
  • 使用 fetch 时文本响应为空

    以下代码 fetch http localhost 8080 root 1487171054127 k query bearer token mode no cors credentials include then function re
  • 获取 Cython 指针的值

    我正在编写一个构造 malloc 的函数unsigned char 数组 然后返回指针 在纯 Cython 或 C 中 这很容易 您所要做的就是在函数上设置返回类型 然后返回指向数组的指针 完毕 但是 我已经达到了需要将指向在 Cython
  • debugByteArray 和 copyPixelsToBuffer 不起作用。 SkImageDecoder::Factory 返回 null

    我有一个类 TouchPoint 实现了 Serialized 因为它包含 Bitmap 所以我为该类编写了 writeObject 和 readObject private void writeObject ObjectOutputStr
  • “绿色线程”和Erlang的进程有什么区别?

    在阅读了 Erlang 的轻量级进程之后 我非常确定它们是 绿色线程 直到我读到绿色线程和Erlang进程之间存在差异 但我不明白 实际差异是什么 绿色线程可以直接在它们之间共享数据内存 尽管当然需要同步 Erlang 不使用 绿色线程 而
  • 一次性计算精度、召回率和 F 分数 - python

    准确度 精确度 召回率和 f 分数是机器学习系统中系统质量的衡量标准 它取决于真 假阳性 阴性的混淆矩阵 给定一个二元分类任务 我尝试了以下方法来获得返回准确度 精确度 召回率和 f 分数的函数 gold 1 0 9 predicted 1
  • .unsubscribe 和 .take(1) 之间的区别

    我想知道 使用之间的性能是否有任何差异 take 1 and unsubscribe when unsubscribe订阅后立即使用 var observable Rx Observable interval 100 First var s
  • Express:从内容类型“application/json; charset=utf-8”中删除 charset=utf-8

    我有一个基于 NodeJS 和 Express 的应用程序 每次我试图获取响应时 我都会得到Content Type application json charset utf 8 我无法在前端解析它 因为我期待带有标头的响应Content
  • 声纳想要关闭流[重复]

    这个问题在这里已经有答案了 我有下一个代码 private Stream
  • 如何在 Spring 3.1 应用程序中声明 JSF 托管 bean?

    这是我第一次开发基于 Java EE 架构的应用程序 我正在使用 JSF 2 0 春季3 1 JPA 2 0 我想请教您一个我有点困惑的问题 我想声明我的 JSF 托管 bean 但有很多解决方案可以处理此约束 在 faces config
  • PHP(文件夹)文件按字母顺序列出?

    我不确定这有多简单 但我正在使用一个显示特定文件夹中的文件的脚本 但是我希望它们按字母顺序显示 这样做会很难吗 这是我正在使用的代码 if handle opendir mainframe gt getCfg absolute path i
  • 为什么在 dll 内不调用 threadTerminate

    我有一个问题 与正常应用程序中的相同代码相比 我的 dll 中的代码的行为不同 经过一些调试后 我发现 dll 中从未调用线程的 OnTerminate type TTest class private public procedure t
  • 将 conda 包安装到 google colab

    我尝试将 anaconda 中的软件包安装到 google 的 colab 中 但这不起作用 整件事都是巫毒魔法 以下代码位于一个单元格中 笔记本的电池 wget https repo anaconda com miniconda Mini
  • 如何在 Objective C 中调用 +class 方法而不引用该类?

    我有一系列 策略 对象 我认为将它们作为一组策略类上的类方法来实现很方便 我为此指定了一个协议 并创建了符合的类 下面仅显示一个 protocol Counter NSInteger countFor Model model end int