如何在Swift连接字符串?

在Objective-C中

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

or

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

但我想用swift语言来写。


当前回答

你可以用多种方式连接字符串:

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

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

你还可以:

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

我相信还有更多的方法。

稍微描述一下

创建一个常数。(有点像NSString)。一旦你设置了它,你就不能改变它的值。你仍然可以把它添加到其他东西,并创建新的变量。

Var创建一个变量。(有点像NSMutableString)所以你可以改变它的值。但是这个问题在Stack Overflow上已经被回答了几次(参见let和var之间的区别)。

Note

实际上,let和var与NSString和NSMutableString非常不同,但它有助于类比。

其他回答

这也会起作用:

var string = "swift"
var resultStr = string + " is a new Programming Language"
let the_string = "Swift"
let resultString = "\(the_string) is a new Programming Language"

来打印组合字符串

Println("\(string1)\(string2)")

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

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

快速连接字符串

关于性能的几句话

UI测试包在iPhone 7(真实设备),iOS 14, -Onone(调试,没有优化)[关于]

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 ->内存问题

Count = 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

*注意将Int转换为字符串

源代码

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

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

例子:

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

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