【问题标题】:Calling NSString method on a String in Swift在 Swift 中对字符串调用 NSString 方法
【发布时间】:2014-07-23 06:43:28
【问题描述】:

Apple 的 Swift documentation 声明

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

如果我有一个字符串对象,例如

var newString: String = "this is a string"

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

【问题讨论】:

    标签: nsstring swift


    【解决方案1】:

    经过一番研究,看起来containsString 不是String 函数,但可以通过桥接到NSString 来访问。

    Using Swift with Cocoa and Objective-C 上的 Apple 文档中,它说

    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")
    

    所有这三个工作。 有趣的是,只有一些NSString 方法可用于Strings,而其他方法需要显式桥接。这可能是 Swift 发展的基础。

    【讨论】:

      【解决方案2】:

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

      var newString: String = "this is a string"
      newString = newString.stringByAppendingString(" that is now longer")
      println(newString)
      

      代替:

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

      注意:

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

      newString.bridgeToObjectiveC().containsString("string")
      

      【讨论】:

      • 只有在 Swift 的内置 String 类型无法提供解决方案的情况下,才真正值得使用 NSString。您可以在 Swift 中使用 ++= 运算符附加字符串,因此 stringByAppendingString 只是语法盐。 (或者你所说的与语法糖相反的任何东西......它只会让你的代码更长,更不可读。)
      • 这是一个很好的观点。我只是想找一个简单的 NSString 方法作为例子。
      • 我同意,我想尽可能使用String 而不是NSString。虽然看起来有几个String 操作,例如上面的stringByAppendingString,但containsString 不是String 上的方法,需要转换为NSString 才能这样做。
      • 这很奇怪。这就是文档关于 String 和 NSString 关系的说法:“Swift 的 String 类型与 Foundation 的 NSString 类无缝桥接。如果您在 Cocoa 或 Cocoa Touch 中使用 Foundation 框架,则整个 NSString API 可用于调用任何您创建的字符串值”
      • 措辞令人困惑,因为它看起来所有 NSString 方法都可用于字符串。但看起来可以通过添加bridgeToObjectiveC() 语句来完成。这条线对我有用:newString.bridgeToObjectiveC().containsString("string")
      【解决方案3】:

      所以你真正要做的就是这个

      var str:NSString = "Checkcontains"
      str.containsString("ckc")
      

      注意显式 NSString 的声明是如何放在那里的。然后你可以使用 containsString 方法。如果你只使用 var 而没有将它设置为 NSString 那就有问题了。

      【讨论】:

      • 看来你是对的。在 Playground 中运行一些测试后,看起来containsString 不是String 的有效方法,需要转换为NSString 才能这样做。 newString.bridgeToObjectiveC().containsString("string")NSString(string: newString).containsString("string") 都对我有用。
      【解决方案4】:

      您可以在 Swift String 对象上调用任何 NSString 方法;在引擎盖下,这两个对象是“免费桥接”的。因此,您可以这样做:

      var newString = "this is a string"
      if newString.containsString("string") {
          //do your stuff
      }
      

      【讨论】:

      • 这似乎不是这样。它只是“字符串没有成员包含字符串”的错误
      • 另外,桥接不是免费的。如果你做了不小的数量,当你在 Instruments 中分析你的代码时,预计会在ext.Foundation.Swift.String._bridgeToObjectiveC(Swift.String)() -> ObjectiveC.NSString 上花费大量时间。桥接,是的,有点像。免费桥接,绝对不是。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-15
      • 1970-01-01
      • 1970-01-01
      • 2014-07-25
      • 2011-04-06
      • 1970-01-01
      相关资源
      最近更新 更多