无法将view.tag ObjC代码转换为Swift

时间:2019-11-27 14:38:53

标签: objective-c swift

我正在将一些代码迁移到Swift,但我偶然发现了这行代码,出于某种原因,它适用于ObjC,但不适用于Swift。

ObjC:

if (view.tag == 'C'+'L'+'O') {

现在我在Swift中写的内容不起作用:

if view.tag == "C" + "L" + "O" {

上面写着Ambiguous reference to operator function '=='

这是为什么?我该如何解决?

2 个答案:

答案 0 :(得分:4)

基于C的语言中的

'C''L''O'char,它们是8位带符号(或无符号)整数,因此它们的值可以是添加并与Int进行比较。

您正在尝试添加"C"的{​​{1}},"L""O",因此带有字符串串联的结果是String {{1 }}。在Swift中,您无法将String"CLO"进行比较。诚然,那将是更好的错误消息。

Swift中的等效项是:

String

由于许多原因,这真的很糟糕,包括顺序无关紧要,因此'C'+'L'+'O'和'O'+'C'+'L'产生相同的结果。 Swift中存在更好的替代方法。 @EmilioPelaez在his answer中提供了一些不错的选择。

答案 1 :(得分:3)

在C和ObjC字符(用单引号'而不是双引号"表示的字符串)中实际上是整数,这就是为什么您可以将它们加在一起并将它们分配给{{ 1}},它是一个整数。

Swift确实具有字符类型,但它不是整数,在这种情况下,您要添加三个字符串,这将导致字符串tag,不能将其分配给{{1} }属性,因为该属性是int。

我个人反对使用view的标签,我更喜欢创建一个子类并创建一个新变量来存储相关信息。

但是,如果要继续使用标签,则可以使用字符串的哈希值,因此"CLO"。这并不是完全等效的,因为tagif view.tag == "CLO".hashValue会有所不同,ObjC不会这样。 注意::正如@Alexander所述,每次启动该应用程序时,哈希值都会有所不同。如果您要在两次启动之间保留数据,请不要使用"CLO".hashValue

更好的选择是创建一个由int支持的枚举并添加其原始值。

一个更好的选择是创建一个选项集,创建一个子类或"COL".hashValue或您正在使用的任何东西,然后添加一个属性以将它们存储在那里。然后,您可以检查视图是否具有所需的所有值。