是否可以在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

在每个文件(不是文件类型)的基础上禁用自动填充模式

是否可以在启动时禁用 Google Play 服务自动登录?

是否可以禁用自动完成?

CentOS7的性能是否提升很多