我正在将一些代码迁移到Swift,但我偶然发现了这行代码,出于某种原因,它适用于ObjC,但不适用于Swift。
ObjC:
if (view.tag == 'C'+'L'+'O') {
现在我在Swift中写的内容不起作用:
if view.tag == "C" + "L" + "O" {
上面写着Ambiguous reference to operator function '=='
这是为什么?我该如何解决?
答案 0 :(得分:4)
'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"
。这并不是完全等效的,因为tag
与if view.tag == "CLO".hashValue
会有所不同,ObjC不会这样。 注意::正如@Alexander所述,每次启动该应用程序时,哈希值都会有所不同。如果您要在两次启动之间保留数据,请不要使用"CLO".hashValue
更好的选择是创建一个由int支持的枚举并添加其原始值。
一个更好的选择是创建一个选项集,创建一个子类或"COL".hashValue
或您正在使用的任何东西,然后添加一个属性以将它们存储在那里。然后,您可以检查视图是否具有所需的所有值。