gpt4 book ai didi

ios - Objective-C 中的转换方法参数

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:40:48 27 4
gpt4 key购买 nike

更新

好的,首先感谢大家的大量事件。似乎我没有很好地表述我的问题,因为许多答案(理所当然地)停留在 id 输入参数上,并且遵循糟糕的设计模式,但这只是一个例子。我将为我的问题添加一些上下文:

  • 假设doSomethingWithParameter:有多个不同的实现,需要一个特定的实例作为输入参数
  • 示例中的我的类将永远SpecificClass 的实例作为输入参数被调用

根据这些断言,这是我的假设:鉴于您知道参数的类型,类型检查和转换没有任何好处,只是为了额外的安全。

原帖

假设我的协议(protocol)声明中有一个通用方法,它接受一个 id 输入参数:

@protocol MyProtocol <NSObject>

- (void)doSomethingWithParameter:(id)inputParameter;

@end

在符合 MyProtocol 的类中,我通常更喜欢像这样显式设置 inputParameter 的类型:

- (void)doSomethingWithParameter:(SpecificClass *)inputParameter
{
/... do something with param
}

有时我会因为选择此解决方案而不是以下解决方案而受到批评:

- (void)doSomethingWithParameter:(id)inputParameter
{
if ([inputParameter isKindOfClass:[SpecificClass class]]) {
SpecificClass *myInstance = (SpecificClass *)inputParameter;
/... do something with param
}
}

我真的更喜欢第一个版本,因为它清楚地说明了我的实例所期望的参数。它更简洁,更清晰。我通常不认为我可以从类型检查/转换中获益太多。

我的问题:从编码标准的角度来看,哪个是更好的解决方案?第一个有什么缺点吗?

最佳答案

更新

从您问题的更新来看,您似乎正在尝试实现现代语言中泛型提供的功能的一些变体。

由于 Objective-C 不支持这种模式,您可以牺牲类型安全性,或者重新考虑您的设计决策。

如果您采用第一种方式,您应该通过其他方式(命名、文档)真正明确您期望的类型。那么假设您的方法只会用适当的参数调用可能是合理的。

但我仍会添加 NSParameterAssert 以简化 future 的调试。


原始答案

如果您使用第一种方法,则说明方法的声明和定义不匹配。由于 obj-c 的动态特性(方法签名不包括参数类型),编译器不会对此报错。

但是,当调用方法时,只有声明是可见的,因此有关参数类型的任何信息都来自于声明 - 所有类型检查(是的,此处由编译器执行)都是基于声明执行的。

总而言之,为避免混淆错误和滥用 API,您绝对应该使用第二种方法。或者连同定义一起更改声明。

编辑

另外,我可以想到第三种解决方案,它将第一种方法的便利性和第二种方法的类型安全性结合起来:

- (void)doSomethingWithParameter:(SpecificClass *)inputParameter
{
NSParameterAssert([inputParameter isKindOfClass:[SpecificClass class]]);

// do something
}

关于ios - Objective-C 中的转换方法参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30095591/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com