ChatGPT解决这个技术问题 Extra ChatGPT

如何在 Swift 中连接字符串?

如何在 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 编译器不能很好地编译 +。如果你在一个句子中有几个+,那么它可能会失败。利用 ( )

C
Community

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

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,也许它适用于最新版本
A
Arbitur

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

str += ""

str = str + ""

str = str + str2

str = "" + ""

str = "\(变量)"

str = str + "\(变量)"

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


不,你错过了 str.append(str2) :P
i
idmean
var language = "Swift" 
var resultStr = "\(language) is a new programming language"

作为旁注,这称为字符串插值,而不是串联。
C
CW0007007

这也可以:

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

J
Jitendra

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

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

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

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

试试这个代码。


B
Bagvendt
let the_string = "Swift"
let resultString = "\(the_string) is a new Programming Language"

R
Rajesh Loganathan

很简单:

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

let ResultString = "\(StringA)\(StringB)"
如果使用插值,则不需要 +,就像 Aks 提到的那样。如果您更喜欢使用 +,请删除插值。
M
Mark Moeykens

您现在可以在 Swift 中使用 stringByAppendingString。

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

i
idmean

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。我会在你读完给我评论后删除它
感谢您的解释:)。不确定什么被认为更好,但是通过在您的答案中添加上下文,它会具有价值,即使目前很难,它可能不像以前那样有用。
A
Anil Gupta

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

      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"

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

希望这对您有所帮助。


S
Sjakelien

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

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

L
Luís Cruz

使用打印组合字符串

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

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

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

P
Pushpa Y

也可以在 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

V
Vittal Pai

斯威夫特 5

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

API 详细信息:here

利用:

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

结果:

Hello
Hello Namaste

m
mjoe7

串联是指 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 上测试


C
Community

斯威夫特 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"

H
H S Progr

来自: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)

e
eurobrew

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

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

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


y
yoAlex5

关于性能的几句话

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

}


S
Sourabh Sharma

斯威夫特 5:

将字符串数组转换为单个字符串

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

为什么对这个答案投反对票?这个答案是将一个字符串数组连接成一个字符串。
Y
Yogendra Singh

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

例子:

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

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