问题标签 [objective-c-protocol]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
objective-c - 将协议定义为仅在实现另一种方法时才需要一种方法
我有一个相当复杂的协议,我正在向其中添加方法。大多数新方法是@optional
,但它们是成对的。
例如,这两种方法一起工作:
在这个例子中,如果实现了第一种方法,我想将第二种方法声明为@required
,否则两者都是可选的。我想要的是一种将协议方法嵌套或分组为全部必需或不基于上下文的方法。
理想情况下是这样的:
objective-c - 在 Objective C 中使用 @protocols 的主要原因是什么?
为什么我要使用协议而不是创建子类并继承方法..?
请给我解释一下,我对这个话题很困惑,我对我正在阅读的书中的解释不太满意。
我在哪里使用协议而不是其他方式来获取方法..?如果我可以子类化一个类并获取方法,为什么我要在需要定义方法的地方使用协议?
objective-c - 是否应该替换已弃用的委托方法到旧版本?
我在 Objective-C 中创建了一个适当的委托协议,我正在更新它。其中一个更新需要弃用一种方法,但它在技术上暂时仍然有效。
这是原始的委托方法。请注意,它是可选的,所以它不是必要的方法,这会影响我对它是否应该保持功能的判断。
它在课堂上被简单明了地用在两个地方。像这样:
现在我已经更新了。在更新中,看起来更好的选择是根据错误发生的时间将函数划分为唯一的错误返回,因为这种方法的使用增长到两个以上的地方,并且可能有非常不同的响应。这允许消费者忽略特定类型的错误,或者至少在没有大量if
语句的情况下以不同的方式处理每个错误。这些是新的委托方法:
在类中,我按预期调用它们,但如果类没有实现较新的方法,我将故障转移到不推荐使用的方法。当然,如果他们没有任何方法,它什么也不做。
在当时这似乎是一个好主意,但我是否只是通过在不推荐使用时保持其功能而使该方法比需要的时间更长?我觉得不推荐使用的方法应该是有用的,只是不鼓励。然后到时候,只需猛拉整个方法。
这看起来像是常见的做法、好主意等吗?欢迎所有评论。只是在处理此类 API 更改时寻找最佳模式。
objective-c-protocol - 如何使用在一个类中定义的按钮,该类继承 UINavigationController 并出现在目标 c 中的每个其他类中?
是否有可能我定义了一个继承 UINavigationController 并在此类中添加按钮的类。当我在另一个类中使用此类时,按钮将显示在每个类的导航栏上。希望很清楚。提前致谢
objective-c - Objective-C 协议作为另一个协议中的参数
我正在尝试创建一个访问我的 web api 的通用存储库(模式)。我无法理解协议在objective-c 中的工作方式(我来自c#,接口有点不同)。
我想要做的是让 ProtocolA 成为另一个 ProtocolB 中的参数,然后在 ProtocolA 上实现 ProtocolB 访问方法,因为传递给 ProtocolB 的对象必须实现 ProtocolA 本身。我是否正确地考虑了这一点?
这是我迄今为止所拥有的,但似乎无法让它发挥作用——也许我的逻辑是错误的:
objective-c - 符合协议的类的类别
我正在尝试为 UIViewController 实现一个类别,并且我想确定该对象符合某个协议。像这样的东西:
这可能吗?
objective-c - 定义无参数协议
我试图在不添加参数的情况下定义协议方法,但找不到正确的语法。
这是定义(它有语法错误)
我不想使用第二个参数传递任何值。我的目的只是表明委托实例发生了一些事情。
我应该如何写定义?
objective-c - 是否有任何自省方法来获取 Objective-C 中一个类的所有采用的协议?
有一种-[NSObject conformsToProtocol:]
方法可以检查是否采用了特定协议。有没有什么方法可以获取一个类的所有采用的协议,而不是检查一个列表?
ios - 为什么委托方法在没有声明协议一致性的情况下工作?
我有一个UITextField
,我从它拖到它的所有者来设置delegate
故事板。
在我的 controller.h 文件中,我没有声明该类符合UITextFieldDelegate
协议。
但是- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
作品!它只是工作!
我想知道为什么?
当我将 UITableView 设置为没有UITableViewDelegate
and的控制器时,我曾经遇到过这种情况UITableViewDataSource
。
objective-c - 为在 Objective-C 中实现特定协议的类创建一个类别?
简短的问题描述
我可以用一个类别扩展 UIView,但它只适用于实现特定协议 ( WritableView
) 的子类吗?
即我可以执行以下操作吗?
详细问题描述
想象一下,我希望将以下类别函数添加到任何实例中UILabel
:
它只是将 UILabel 的text
属性设置为google.com
.
同样,我希望能够在其他几个类上调用此函数:
假设到目前为止我对我的设计非常满意,并且我想为所有 4 个类添加另外 2 个方法:
所以现在我们有 4 个类,每个类有 3 个方法。如果我想真正完成这项工作,我需要编写 12 个函数(4*3)。随着我添加更多功能,我需要在我的每个子类上实现它们,这很快就会变得非常难以维护。
相反,我只想实现这些方法一次,并简单地在支持的组件上公开一个新的类别方法,称为writeText:
. 通过这种方式,我可以将数量减少到 4(每个支持的组件一个)+ 3(每个可用的方法一个),而不是实现 12 个函数,总共需要实现 7 个方法。
注意:这些是愚蠢的方法,仅用于说明目的。重要的部分是有许多方法(在本例中为 3),它们的代码不应该重复。
我尝试实现这一点的第一步是注意到这 4 个类的第一个共同祖先是UIView
. 因此,将这 3 种方法放在一个类别中似乎是合乎逻辑的UIView
:
只要当前 UIView 的实例符合WritableView
协议,这 3 个方法就可以工作。因此,我使用以下代码扩展了我的 4 个受支持的类:
现在,当我调用以下命令时:
有用!哈扎!一切都很完美......直到我尝试这个:
代码编译(因为UISlider
继承自UIView
),但在运行时失败(因为UISlider
不符合WritableView
协议)。
我真正想做的是让这 3 种方法只对那些writeText:
实现了方法的 UIView 可用(即那些实现WritableView
我设置的协议的 UIView)。理想情况下,我会在 UIView 上定义我的类别,如下所示:
这个想法是,如果这是有效的语法,它会[slider setTextToDomainOfUrl:@"http://apple.com"]
在编译时失败(因为UISlider
从不实现WritableView
协议),但它会让我所有的其他示例成功。
所以我的问题是:有没有办法用一个类别来扩展一个类,但仅限于那些实现了特定协议的子类?
我意识到我可以将断言(检查它是否符合协议)更改为if
语句,但这仍然可以编译有问题的 UISlider 行。没错,它不会在运行时导致异常,但也不会导致任何事情发生,这是我也试图避免的另一种错误。
尚未得到满意答案的类似问题:
- 符合协议的类的类别:这个问题似乎在问同样的事情,但没有给出具体的例子,所以它似乎被误解为别的意思。
- 在 Objective-C 中定义协议的类别?:提供了不同的示例,因此接受的答案说在需要该方法的每个类的类别中实现它(即在我的示例中您最终会得到 12 个方法);这是一个完全好的答案,但对于这个问题并不是一个很好的解决方案。
- 如何定义一个将方法添加到实现特定协议的类的类别?: 提问者选择了检查协议的实现(如果不符合则什么都不做),但是如果你想让它在编译时发现错误怎么办?