Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 无法将view.tag ObjC代码转换为Swift_Objective C_Swift - Fatal编程技术网

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

Objective c 无法将view.tag ObjC代码转换为Swift,objective-c,swift,Objective C,Swift,我正在将一些代码迁移到Swift,我偶然发现了这一行代码,出于某种原因,它可以与ObjC一起使用,但不能与Swift一起使用 ObjC: 现在我用Swift写的东西不起作用了: if view.tag == "C" + "L" + "O" { 它表示对运算符函数“==”的引用不明确 为什么会这样?如何修复它?在C和ObjC中,用单引号表示的字符,而不是字符串的双引号,实际上是整数,这就是为什么可以将它们添加在一起并将它们分配给标记的原因,标记是整数 Swift确实有一个字符类型,但它不是int

我正在将一些代码迁移到Swift,我偶然发现了这一行代码,出于某种原因,它可以与ObjC一起使用,但不能与Swift一起使用

ObjC:

现在我用Swift写的东西不起作用了:

if view.tag == "C" + "L" + "O" {
它表示对运算符函数“==”的引用不明确


为什么会这样?如何修复它?

在C和ObjC中,用单引号表示的字符,而不是字符串的双引号,实际上是整数,这就是为什么可以将它们添加在一起并将它们分配给标记的原因,标记是整数

Swift确实有一个字符类型,但它不是int,在本例中,您添加了三个字符串,这将导致字符串CLO,该字符串不能分配给tag属性,因为该属性是int

就我个人而言,我反对使用视图的标记,我更喜欢创建一个子类并创建一个新变量来存储相关信息

但是,如果希望继续使用标记,可以使用字符串的哈希值,因此如果view.tag==CLO.hashValue。这并不是完全等效的,因为CLO.hashValue将不同于COL.hashValue,而在ObjC中则不是这样。注意:@Alexander提到,每次启动应用程序时,哈希值都会不同。如果要在两次启动之间持久化数据,请不要使用hashValue

更好的替代方法是创建一个int支持的枚举并添加它们的原始值

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

基于C的语言中的“C”、“L”和“O”是8位有符号或无符号整数的字符,因此可以将它们的值相加并与整数进行比较

您试图添加C、L和O,它们是字符串,因此字符串连接的结果是字符串CLO。在Swift中,不能将字符串与Int进行比较。诚然,这是更好的错误消息

Swift中的等效值为:

if view.tag == UnicodeScalar("C").value + UnicodeScalar("L").value + UnicodeScalar("O").value {

这真的很糟糕,原因有很多,包括顺序并不重要,所以“C”+“L”+“O”和“O”+“C”+“L”会产生相同的结果。Swift中存在更好的替代方案@EmilioPelaez在中给出了一些很好的选择。

我的一般建议是假装标签不存在。在我看来,它们是一个设计错误,因为有很多不同的、更好的方法来识别子视图。那么,我将尝试以不同的方式来处理这个问题。非常感谢。hashValue也不起作用,因为Swift的哈希算法是在程序启动时随机播种的,以防止基于哈希冲突的DoS攻击@Alexander ReinstateMonica,我没有感觉到它们会坚持启动之间的值,但我还是添加了一个注释。@ EiMiopelaz如果在每个应用程序启动时都以编程方式设置,那就很好了,但是考虑到标签可能在界面生成器文件中静态设置。谢谢你的回答!
if view.tag == UnicodeScalar("C").value + UnicodeScalar("L").value + UnicodeScalar("O").value {