是否可以在objective-c中禁用自动类型提升
Posted
技术标签:
【中文标题】是否可以在objective-c中禁用自动类型提升【英文标题】:is it possible to disable automatic type promotion in 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
范围后调用新方法。
【参考方案1】:
不,我不知道如何禁用它。一个 int 可以表示为 double 就好了(例如),我认为没有办法禁用它。
问题仍然存在:为什么?也许你应该重新考虑你的设计
当然,您可以通过在各处使用自定义数字类型来“伪造”:D 例如如果你有 struct myInt 和 struct myDouble 它不会改变类型
【讨论】:
感谢您的回答-为什么,请参阅我上面的评论。我不确定引入自定义数字类型是否真的能抓住这一点。 - 编译器也会在自定义类型之间自动升级。 不,如果它们不同,则不会......例如如果你有 struct myInt 和 struct myDouble 它不会改变类型 啊,我明白你的意思了。是的,这可能是一种方法,谢谢!以上是关于是否可以在objective-c中禁用自动类型提升的主要内容,如果未能解决你的问题,请参考以下文章
是否可以禁用 Mongoose SchemaTypes 的自动类型转换?
使用 Objective-C 在 iPhone 上禁用 WIFI