我对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相当新,并试图围绕其中的一些概念。任何人都可以澄清这个吗?
答案 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。希望它有所帮助!