如何将Swift String桥接到Objective C NSString?

Bre*_*ren 14 string ios swift

我服用疯狂的药吗?直接从文档中删除:

"Swift自动在String类型和NSString类之间架起桥梁.这意味着在使用NSString对象的任何地方,您都可以使用Swift String类型,并获得两种类型的好处 - String类型的插值和Swift设计的API以及NSString类的广泛功能.因此,您几乎不需要在自己的代码中直接使用NSString类.实际上,当Swift导入Objective-C API时,它会用String类型替换所有NSString类型.当您的Objective-C代码使用Swift类时,导入器会在导入的API中使用NSString替换所有String类型.

要启用字符串桥接,只需导入Foundation."

我这样做了......考虑一下:

import Foundation

var str = "Hello World"

var range = str.rangeOfString("e")

// returns error: String does not contain member named: rangeOfString()
Run Code Online (Sandbox Code Playgroud)

然而:

var str = "Hello World" as NSString

var range = str.rangeOfString("e")

// returns correct (2, 1)
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

Zor*_*ayr 31

从去StringNSString使用下面的构造函数:

let swiftString:String = "I'm a string."
let objCString:NSString = NSString(string:swiftString)
Run Code Online (Sandbox Code Playgroud)

在Xcode 7(测试版),使用从低垂StringNSString,如在下面的例子,将导致警告消息,从铸'字符串?不相关的类型'NSString'总是失败:

let objcString:NSString = swiftString as! NSString // results in error
Run Code Online (Sandbox Code Playgroud)


Cih*_*Tek 8

您已经在问题中找到了答案.你错过了演员.在编写Swift代码时,就像这样的语句

var str = "Hello World"
Run Code Online (Sandbox Code Playgroud)

创造一个Swift String,而不是一个NSString.为了使其工作NSString,您应该在使用之前将其转换为NSString使用as操作符.

这与调用用Objective-C编写的方法并提供String而不是NSString作为参数的方法不同.

  • 注意这部分.`当Swift导入Objective-C API时,它用String类型替换所有NSString类型.当你的Objective-C代码使用Swift类时,导入器会在导入的API中用NSString替换所有的String类型.这意味着你可以为一个需要`NSString`的方法提供一个快速的`String`,或者反之亦然.这并不意味着你可以创建一个快速的`String`并使用它,好像它是一个`NSString`变量到处都是. (2认同)