【问题标题】:is it possible to disable automatic type promotion in objective-c是否可以在objective-c中禁用自动类型提升
【发布时间】:2014-11-18 05:14:09
【问题描述】:

说我有一些像这样的objective-C:

- (void) foo:(double)doubleVal;

有没有办法让下面的代码编译失败:

int integerVal;
[self foo:integerVal];

当这段代码成功时:

double doubleVal;
[self foo:doubleVal];

?

理想情况下,我只能对 foo 执行此操作,而不是全局执行此操作。

提前致谢, 猎户座

【问题讨论】:

  • 很好奇,你为什么希望它失败? double 可以处理任何 int 值。
  • 好问。这是因为我做了一个重构,它不仅改变了这个参数的类型,还改变了预期的范围。特别是作为 int 的范围是 0 - 255,作为 double 范围是 0.0 - 1.0。我有一堆代码需要转换为匹配,如果让编译器为我找出所有用例,那就太好了。
  • 通过这种重构,我会保留旧方法,然后创建一个名称稍有不同的新方法。新的采用double,旧的采用int。这可以防止任何现有代码被破坏。现在您可以根据需要更改代码以使用新方法(和新范围)。您甚至可以不理会所有旧代码,将旧方法更改为在将int 转换为新的double 范围后调用新方法。

标签: objective-c type-promotion


【解决方案1】:

不,我不知道如何禁用它。一个 int 可以表示为 double 就好了(例如),我认为没有办法禁用它。

问题仍然存在:为什么?也许你应该重新考虑你的设计

当然,您可以通过在各处使用自定义数字类型来“伪造”:D
例如如果你有 struct myInt 和 struct myDouble 它不会改变类型

【讨论】:

  • 感谢您的回答-为什么,请参阅我上面的评论。我不确定引入自定义数字类型是否真的能抓住这一点。 - 编译器也会在自定义类型之间自动升级。
  • 不,如果它们不同,则不会......例如如果你有 struct myInt 和 struct myDouble 它不会改变类型
  • 啊,我明白你的意思了。是的,这可能是一种方法,谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-05-07
  • 1970-01-01
  • 2015-09-11
  • 2011-04-13
  • 1970-01-01
  • 2015-11-29
  • 1970-01-01
  • 2021-05-09
相关资源
最近更新 更多