在Swift中调用String上的NSString方法

Jpo*_*hik 29 nsstring swift

Apple的Swift 文档说明了这一点

如果您在Cocoa或Cocoa Touch中使用Foundation框架,则可以使用整个NSString API调用您创建的任何String值

如果我有一个String对象,例如

var newString: String = "this is a string"
Run Code Online (Sandbox Code Playgroud)

如何containsString在我的String var上执行NSString操作?

Jpo*_*hik 36

做了一些研究之后,它看起来containsString不是一个String功能,但可以通过桥接来访问NSString.

在Apple关于将Swift与Cocoa和Objective-C一起使用的文档中,它说

Swift自动在String类型和NSString类之间架起桥梁.这意味着在使用NSString对象的任何地方,您都可以使用Swift String类型,并获得两种类型的好处

但似乎只有部分NSString的函数可以在没有明确桥接的情况下访问.要桥接到NSString并使用其任何功能,以下方法有效:

 //Example Swift String var
    var newString:String = "this is a string"

    //Bridging to NSString
    //1
    (newString as NSString).containsString("string")
    //2
    newString.bridgeToObjectiveC().containsString("string")
    //3
    NSString(string: newString).containsString("string")
Run Code Online (Sandbox Code Playgroud)

所有这三项工作.有趣的是,只有一些NSString方法可用,Strings而其他方法需要明确的桥接.这可能是随着Swift的发展而建立的.


Con*_*nor 9

方法是相同的,但它们只是使用swift的语法.例如:

var newString: String = "this is a string"
newString = newString.stringByAppendingString(" that is now longer")
println(newString)
Run Code Online (Sandbox Code Playgroud)

代替:

NSString* newString = @"this is a string";
newString = [newString stringByAppendingString:@" that is now longer"];
NSLog(newString);
Run Code Online (Sandbox Code Playgroud)

注意:

并非所有NSString的方法都可以在String上调用.有些你必须首先桥接到NSString:

newString.bridgeToObjectiveC().containsString("string")
Run Code Online (Sandbox Code Playgroud)

  • 使用NSString是非常值得的,其中Swift的内置`String`类型不提供解决方案.您可以使用`+`和`+ =`运算符在Swift中追加字符串,因此`stringByAppendingString`只是语法盐.(或者你所谓的语法糖的反面......它只会使你的代码更长,更不易读.) (5认同)
  • 措辞令人困惑,因为它似乎所有NSString方法都可用于字符串.但看起来它可以通过添加`bridgeToObjectiveC()`语句来完成.这行适用于我:`newString.bridgeToObjectiveC().containsString("string")` (2认同)