关于在Swift中采用Objective-C协议的困惑

时间:2015-07-22 19:09:24

标签: ios objective-c swift

我对Swift相对较新,但在Objective-C方面经验丰富。

我正处于将Swift集成到现有基于Objective-C的应用程序的开始阶段。我在Swift中编写了一个类来模仿我们现有类之一的行为。在新的Swift类中,我实现了一个用Obj-C编写的协议。

在协议中,有一个必需的方法定义如下:

$xpath = new DOMXpath($html);
$tds = $xpath->query("//td[position()=last() or (position()=last()-1)]");

foreach($tds as $td)
   $td->setAttribute('rowspan', 5);

在我的Swift课程中,我按如下方式实现了它:

 $sql .= "VALUES($memNumber,'$fname','$lname','$dob','$country','$street','$city','$state',
            '$zip','$email','$phone','$club')";

方法签名是XCode代码完成产生的。所以这是我的问题:在Swift String中不是一个对象,但是NSString是。如果我用... )VALUES($memNumber, ... 而不是-(NSString*)getWName; 替换此方法的返回类型,我的Swift类不再符合协议,我收到错误。

正如我所说,我对Swift相当新,并试图围绕其中的一些概念。任何人都可以澄清这个吗?

1 个答案:

答案 0 :(得分:4)

Obj-C中的基本对象也与Swift中的对象相同。它们之间是无缝桥接的。来自Apple docs for String:

  

Swift自动在String类型和NSString之间架起桥梁   类。这意味着您可以在任何地方使用NSString对象   使用Swift String类型代替并获得两者的好处   字符串类型的插值和Swift设计的API,以及   NSString类的广泛功能。出于这个原因,你应该   几乎从不需要在您自己的代码中直接使用NSString类。   事实上,当Swift导入Objective-C API时,它取代了所有的   具有String类型的NSString类型。当您的Objective-C代码使用   Swift类,导入器替换所有的String类型   导入API中的NSString。

现在回答你关于为什么它实际上不起作用的问题,请多读一段:

  

要启用字符串桥接,只需导入Foundation。例如,你   可以在NSString类上访问capitalizedString-a属性   Swift字符串,Swift自动将Swift字符串桥接到   NSString对象并访问该属性。该物业甚至返回一个   Swift String类型,因为它是在导入期间转换的。

主要问题是在导入期间,它实际上在内部更改了该数据类型,因此定义更改为 - > NSString到String。然后Analyzer会认为您的数据类型不匹配。

通常,使用旧数据类型没有任何优势。我使用NSString已经有一段时间了,因为在早期版本的swift中,String对象上基于字符的操作存在问题,但现在已经解决了。

如果你真的需要使用它,你可以强行输入它:

let myNSString = myString as! NSString

您可以阅读更多about data types here。希望它有所帮助!