【问题标题】:How do I concatenate strings in Swift?如何在 Swift 中连接字符串?
【发布时间】:2014-07-24 21:51:35
【问题描述】:

如何在 Swift 中连接字符串?

Objective-C 我们喜欢

NSString *string = @"Swift";
NSString *resultStr = [string stringByAppendingString:@" is a new Programming Language"];

NSString *resultStr=[NSString stringWithFormat:@"%@ is a new Programming Language",string];

但我想用 Swift 语言来做这个。

【问题讨论】:

  • Swift 编译器不能很好地编译 +。如果你在一个句子中有几个+,那么它可能会失败。使用 ( )

标签: string swift concat string-concatenation


【解决方案1】:

您可以通过多种方式连接字符串:

let a = "Hello"
let b = "World"

let first = a + ", " + b
let second = "\(a), \(b)"

你也可以这样做:

var c = "Hello"
c += ", World"

我相信还有更多方法。

一点描述

let 创建一个常量。 (有点像NSString)。一旦你设置了它,你就不能改变它的值。不过,您仍然可以将其添加到其他事物中并创建新变量。

var 创建一个变量。 (有点像NSMutableString)所以你可以改变它的值。但这已经在 Stack Overflow 上得到了多次回答(请参阅 difference between let and var)。

注意

实际上letvarNSStringNSMutableString非常不同,但它有助于类比。

【讨论】:

  • @Rajneesh071 为什么会出现编译时错误?
  • let 创建一个常量。 (有点像 NSString)。一旦你设置了它,你就不能改变它的值。不过,您仍然可以将其添加到其他事物并创建新变量。 var 创建一个变量。 (有点像 NSMutableString)所以你可以改变它的值。但这已在 SO 上多次回答。寻找difference between let and var
  • let a = "Hello" let b = "World" let first = a + ", " + b 不行,这样行, let first = "(a), (b) ” 。第一种方法会出现运行时错误
  • @Joseph 对我来说很好用。 i.imgur.com/T15s4Sp.png 不过感谢您的反对。
  • @Fogmeister 您使用的是哪个版本的 xCode?不适用于 xCode 6.3 Beta,可能在最新版本上工作
【解决方案2】:

您可以通过以下方式添加字符串:

  • str += ""
  • str = str + ""
  • str = str + str2
  • str = "" + ""
  • str = "\(variable)"
  • str = str + "\(variable)"

我想我都给他们起了名字。

【讨论】:

  • 不,你错过了 str.append(str2) :P
【解决方案3】:
var language = "Swift" 
var resultStr = "\(language) is a new programming language"

【讨论】:

  • 附带说明,这称为字符串插值,而不是串联。
【解决方案4】:

这也可以:

var string = "swift"
var resultStr = string + " is a new Programming Language"

【讨论】:

    【解决方案5】:

    \ this 用于将一个字符串附加到另一个字符串。

    var first = "Hi" 
    var combineStr = "\(first) Start develop app for swift"
    

    你也可以试试这个:-+关键字。

     var first = "Hi" 
     var combineStr = "+(first) Start develop app for swift"
    

    试试这个代码。

    【讨论】:

      【解决方案6】:
      let the_string = "Swift"
      let resultString = "\(the_string) is a new Programming Language"
      

      【讨论】:

        【解决方案7】:

        非常简单:

        let StringA = "Hello"
        let StringB = "World"
        let ResultString = "\(StringA)\(StringB)"
        println("Concatenated result = \(ResultString)")
        

        【讨论】:

        • let ResultString = "\(StringA)\(StringB)"
        • 如果使用插值,则不需要 +,就像 Aks 提到的那样。如果您更喜欢使用 +,请删除插值。
        【解决方案8】:

        您现在可以在 Swift 中使用 stringByAppendingString

        var string = "Swift"
        var resultString = string.stringByAppendingString(" is new Programming Language")
        

        【讨论】:

          【解决方案9】:

          Xcode 不接受使用普通字符串添加的可选字符串。我写了这个扩展来解决这个问题:

          extension String {
              mutating func addString(str: String) {
                  self = self + str
              }
          }
          

          那么你可以这样称呼它:

          var str1: String?
          var str1 = "hi"
          var str2 = " my name is"
          str1.addString(str2)
          println(str1) //hi my name is
          

          但是你现在也可以这样做:

          var str1: String?
          var str1 = "hi"
          var str2 = " my name is"
          str1! += str2
          

          【讨论】:

          • 哪一部分?你熟悉扩展吗?
          • 是的,我想知道通过在 'addString()' 中转换 '+' 可以获得什么。如果我没记错的话,如果在非可变变量上使用这种方式也会给你一个警告而不是编译器错误。否则它会混淆正在发生的事情,而且,IMO,没有什么比“+”更容易/更快地阅读了。事实是我可能是有原因的,这就是为什么我要问为什么这种方式是“推荐”的
          • 当 xcode 不接受使用普通字符串添加可选字符串时,我使用了这个。它仍然不能直接执行此操作,但是现在当您强制解开字符串时它可以工作,因此此扩展名在 atm 中是无用的。你读完给我评论后我会删除它
          • 感谢您的解释 :)。不确定什么被认为更好,但是通过在您的答案中添加上下文,它会具有价值,即使目前很难,它可能不像以前那么有用。
          【解决方案10】:

          它被称为字符串插值。 这是使用常量、变量、文字和表达式创建新字符串的方法。 例如:

                let price = 3
                let staringValue = "The price of \(price) mangoes is equal to \(price*price) "
          

          还有

          let string1 = "anil"
          let string2 = "gupta"
          let fullName = string1 + string2  // fullName is equal to "anilgupta"
          or 
          let fullName = "\(string1)\(string2)" // fullName is equal to "anilgupta"
          

          它也意味着连接字符串值。

          希望这对您有所帮助。

          【讨论】:

            【解决方案11】:

            使用

            打印组合字符串
            Println("\(string1)\(string2)")
            

            或String3存储2个字符串组合的输出

            let strin3 = "\(string1)\(string2)"
            

            【讨论】:

              【解决方案12】:

              也可以在 Swift 中使用 stringByAppendingFormat。

              var finalString : NSString = NSString(string: "Hello")
              finalString = finalString.stringByAppendingFormat("%@", " World")
              print(finalString) //Output:- Hello World
              finalString = finalString.stringByAppendingFormat("%@", " Of People")
              print(finalString) //Output:- Hello World Of People
              

              【讨论】:

                【解决方案13】:

                我刚从Objective-C切换到Swift(4),发现自己经常用:

                let allWords = String(format:"%@ %@ %@",message.body!, message.subject!, message.senderName!)
                

                【讨论】:

                  【解决方案14】:

                  斯威夫特 5

                  您可以使用appending API 来实现它。这将返回一个通过将给定字符串附加到接收器而生成的新字符串。

                  API 详细信息:here

                  使用

                  var text = "Hello"
                  text = text.appending(" Namaste")
                  

                  结果

                  Hello
                  Hello Namaste
                  

                  【讨论】:

                    【解决方案15】:

                    斯威夫特 4.2

                    你也可以使用扩展:

                    extension Array where Element == String? {
                        func compactConcate(separator: String) -> String {
                            return self.compactMap { $0 }.filter { !$0.isEmpty }.joined(separator: separator)
                        }
                    }
                    

                    用途:

                    label.text = [m.firstName, m.lastName].compactConcate(separator: " ")
                    

                    结果:

                    "The Man"
                    "The"
                    "Man"
                    

                    【讨论】:

                      【解决方案16】:

                      来自:Matt Neuburg 书籍“iOS 13 Programming Fundamentals with Swift”。 :

                      组合(连接)两个字符串,最简单的方法是使用+运算符

                      let s = "hello"
                      let s2 = " world"
                      let greeting = s + s2
                      

                      这种方便的表示法是可能的,因为 + 运算符 被重载:当操作数是数字时(数字加法),它做一件事,而当操作数是字符串(连接)时,它做另一件事。 + 运算符 带有 += 赋值 快捷方式;自然,左边的变量肯定是用var声明的:

                      var s = "hello"
                      let s2 = " world"
                      s += s2
                      

                      作为 +=替代方法,您可以调用 append(_:) 实例方法:

                      var s = "hello"
                      let s2 = " world"
                      s.append(s2)
                      

                      连接字符串的另一种方法是使用 joined(separator:) 方法。您从要连接的 字符串数组 开始,然后将要插入到所有字符串之间的字符串交给它:

                      let s = "hello"
                      let s2 = "world"
                      let space = " "
                      let greeting = [s,s2].joined(separator:space)
                      

                      【讨论】:

                        【解决方案17】:

                        连接是指 Swift 中字符串的组合。字符串可能包含文本、整数甚至表情符号!字符串连接有很多方法。让我列举一些:

                        相同的字符串

                        使用 +=

                        如果我们想添加到已经存在的字符串,这很有用。为此,我们的 String 应该是可变的或可以修改的,从而将其声明为变量。例如:

                        var myClassmates = "John, Jane"
                        myClassmates += ", Mark" // add a new Classmate
                        // Result: "John, Jane, Mark"
                        

                        不同的字符串

                        如果我们想将不同的字符串组合在一起,例如:

                        let oldClassmates = "John, Jane" 
                        let newClassmate = "Mark"
                        

                        我们可以使用以下任何一种:

                        1) 使用 +

                        let myClassmates = oldClassmates + ", " + newClassmate
                        // Result: "John, Jane, Mark"
                        

                        请注意,每个字符串可能是变量或常量。如果您只想更改一次值,请将其声明为常量。

                        2) 字符串插值

                        let myClassmates = "\(oldClassmates), \(newClassmate)"
                        // Result: "John, Jane, Mark"
                        

                        3) 附加

                        let myClassmates = oldClassmates.appending(newClassmate)
                        // Result: "John, Jane, Mark"
                        

                        有关更多信息,请参阅Swift Book 中的字符串和字符。

                        更新:在 Swift 5.1 上测试

                        【讨论】:

                          【解决方案18】:

                          您可以使用 SwiftString (https://github.com/amayne/SwiftString) 来执行此操作。

                          "".join(["string1", "string2", "string3"]) // "string1string2string"
                          " ".join(["hello", "world"]) // "hello world"
                          

                          免责声明:我写了这个扩展

                          【讨论】:

                            【解决方案19】:

                            关于性能的几句话

                            带有 iOS 14 的 iPhone 7(真实设备)上的 UI 测试包

                            var result = ""
                            for i in 0...count {
                                <concat_operation>
                            }
                            
                            

                            计数 = 5_000

                            //Append
                            result.append(String(i))                         //0.007s 39.322kB
                            
                            //Plus Equal
                            result += String(i)                              //0.006s 19.661kB
                            
                            //Plus
                            result = result + String(i)                      //0.130s 36.045kB
                            
                            //Interpolation
                            result = "\(result)\(i)"                         //0.164s 16.384kB
                            
                            //NSString
                            result = NSString(format: "%@%i", result, i)     //0.354s 108.142kB
                            
                            //NSMutableString
                            result.append(String(i))                         //0.008s 19.661kB
                            

                            禁用下一个测试:

                            • 加上高达 100_000 ~10s
                            • 插值高达 100_000 ~10s
                            • NSString 最多 10_000 -> 内存问题

                            计数 = 1_000_000

                            //Append
                            result.append(String(i))                         //0.566s 5894.979kB
                            
                            //Plus Equal
                            result += String(i)                              //0.570s 5894.979kB
                            
                            //NSMutableString
                            result.append(String(i))                         //0.751s 5891.694kB
                            

                            *注意Convert Int to String

                            源代码

                            import XCTest
                            
                            class StringTests: XCTestCase {
                            
                                let count = 1_000_000
                                
                                let metrics: [XCTMetric] = [
                                    XCTClockMetric(),
                                    XCTMemoryMetric()
                                ]
                                
                                let measureOptions = XCTMeasureOptions.default
                            
                                
                                override func setUp() {
                                    measureOptions.iterationCount = 5
                                }
                                
                                func testAppend() {
                                    var result = ""
                                    measure(metrics: metrics, options: measureOptions) {
                                        for i in 0...count {
                                            result.append(String(i))
                                        }
                                    }
                            
                                }
                                
                                func testPlusEqual() {
                                    var result = ""
                                    measure(metrics: metrics, options: measureOptions) {
                                        for i in 0...count {
                                            result += String(i)
                                        }
                                    }
                                }
                                
                                func testPlus() {
                                    var result = ""
                                    measure(metrics: metrics, options: measureOptions) {
                                        for i in 0...count {
                                            result = result + String(i)
                                        }
                                    }
                                }
                                
                                func testInterpolation() {
                                    var result = ""
                                    measure(metrics: metrics, options: measureOptions) {
                                        for i in 0...count {
                                            result = "\(result)\(i)"
                                        }
                                    }
                                }
                                
                                //Up to 10_000
                                func testNSString() {
                                    var result: NSString =  ""
                                    measure(metrics: metrics, options: measureOptions) {
                                        for i in 0...count {
                                            result = NSString(format: "%@%i", result, i)
                                        }
                                    }
                                }
                                
                                func testNSMutableString() {
                                    let result = NSMutableString()
                                    measure(metrics: metrics, options: measureOptions) {
                                        for i in 0...count {
                                            result.append(String(i))
                                        }
                                    }
                                }
                            
                            }
                            
                            

                            【讨论】:

                              【解决方案20】:

                              斯威夫特 5:

                              字符串数组变成单个字符串

                              let array = ["Ramana","Meharshi","Awareness","Oneness","Enlightnment","Nothing"]
                              let joined = array.joined(separator: ",")
                              

                              【讨论】:

                              • 为什么对这个答案投反对票?这个答案是将一个字符串数组连接成一个字符串。
                              【解决方案21】:

                              在 Swift 5 中,苹果引入了使用 # 符号的原始字符串。

                              例子:

                              print(#"My name is "XXX" and I'm "28"."#)
                              let name = "XXX"
                              print(#"My name is \#(name)."#)
                              

                              符号 # 在 \ 之后是必需的。常规 \(name) 将被解释为字符串中的字符。

                              【讨论】:

                                猜你喜欢
                                • 1970-01-01
                                • 2016-08-30
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 2015-11-26
                                • 1970-01-01
                                相关资源
                                最近更新 更多