当专门处理非可选的String
值时,String内插和String串联之间的区别是什么?
struct MyModel {
let value1: String
let value2: String
var displayNameByConcatenation: String {
return value1 + "-" + value2
}
var displayNameByInterpolation: String {
return "\(value1)-\(value2)"
}
}
displayNameByConcatenation
和displayNameByInterpolation
是不同的?比如长unicode字符串
的行为或插值的行为,使它们不同
请注意,从这个问题中,我们了解到字符串插值将使用CustomStringConvertible的描述
。但是字符串
串联(运算符)是否也调用
描述
?
“串联允许您将多个字符串组合在一起,它只适用于两个字符串。”
更新。不确定Swift的早期版本允许使用什么,但目前您可以在同一语句中将两个以上的字符串连接在一起:
let str=“嗨,我的名字是”
var concat=str“2”“3”“4”“5”works”//displays“嗨,我的名字是2345 works”
因为的两个操作数都必须是字符串,所以如果要向字符串中添加数字,则必须做一些额外的工作:
var concat2=str String(2)//显示“嗨,我的名字是2”
插值而非串联的原因,这里引用了苹果公司的插值简介:“字符串插值是一种从常数、变量、文字和表达式的组合中构造新字符串值的方法”。换句话说,你可以使用数字、布尔等的插值,而无需先将它们转换为字符串,如果使用串联,就必须这样做。
从速度的角度来看,要区分串联(value1“-“value2
)和插值(“\(value1)-(value2)”
),结果可能取决于为获得最终字符串而执行的操作数。
我在iPhone 8上的结果显示:
谢谢你们警笛手发现一个并不总是比另一个快!
自己尝试一下(别忘了根据需要调整测试的角色集和迭代):
import UIKit
class ViewController: UIViewController {
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
DispatchQueue.global(qos: .default).async {
ViewController.buildDataAndTest()
}
}
private static func buildDataAndTest(times: Int = 1_000) {
let characterSet = CharacterSet.alphanumerics
characterSet.cacheAllCharacters()
let data: [(String, String)] = (0 ..< times).map { _ in
(characterSet.randomString(length: 50), characterSet.randomString(length: 20))
}
_ = testCIA(data)
_ = testInterpol(data)
print("concatenation: " + String(resultConcatenation))
print("interpolation: \(resultInterpolation)")
}
/// concatenation in array
static var resultConcatenation: CFTimeInterval = 0
private static func testCIA(_ array: [(String, String)]) -> String {
var foo = ""
let start = CACurrentMediaTime()
for (a, b) in array {
foo = foo + " " + a + "+" + b
}
resultConcatenation = CACurrentMediaTime() - start
return foo
}
/// interpolation
static var resultInterpolation: CFTimeInterval = 0
private static func testInterpol(_ array: [(String, String)]) -> String {
var foo = ""
let start = CACurrentMediaTime()
for (a, b) in array {
foo = "\(foo) \(a)+\(b)"
}
resultInterpolation = CACurrentMediaTime() - start
return foo
}
}
extension CharacterSet {
static var cachedCharacters: [Character] = []
public func cacheAllCharacters() {
CharacterSet.cachedCharacters = characters()
}
/// extracting characters
/// https://stackoverflow.com/a/52133647/1033581
public func characters() -> [Character] {
return codePoints().compactMap { UnicodeScalar($0) }.map { Character($0) }
}
public func codePoints() -> [Int] {
var result: [Int] = []
var plane = 0
for (i, w) in bitmapRepresentation.enumerated() {
let k = i % 8193
if k == 8192 {
plane = Int(w) << 13
continue
}
let base = (plane + k) << 3
for j in 0 ..< 8 where w & 1 << j != 0 {
result.append(base + j)
}
}
return result
}
// http://stackoverflow.com/a/42895178/1033581
public func randomString(length: Int) -> String {
let charArray = CharacterSet.cachedCharacters
let charArrayCount = UInt32(charArray.count)
var randomString = ""
for _ in 0 ..< length {
randomString += String(charArray[Int(arc4random_uniform(charArrayCount))])
}
return randomString
}
}
本文向大家介绍C#中String与string的区别分析,包括了C#中String与string的区别分析的使用技巧和注意事项,需要的朋友参考一下 本文实例展示了C#程序设计中String与string的区别,对于C#初学者来说有很好的参考借鉴价值。具体如下: 一、区别分析: String:类,System.String string:类型,变量 两者本质上没有任何区别,都是System.Stri
问题内容: 我可以使用字符串插值或String初始值设定项将int,float,double读取为字符串。结果总是一样的。 结果是一样的。d的值为“ 2e” 我发现的唯一区别是,字符串插值()可以在双引号内使用,而String()不能在双引号内使用。 这就是全部?我在这里想念什么吗? 问题答案: 字符串插值为您提供了调用该项目的结果。 调用初始化程序并返回一个值,该值通常与从字符串插值中获得的值相
本文向大家介绍string与stringbuilder两者的区别,包括了string与stringbuilder两者的区别的使用技巧和注意事项,需要的朋友参考一下 String 对象是不可改变的。每次使用 System.String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。 StringBuilder 对象是动态对象,允许扩充它所封装的字符串中字符的
本文向大家介绍string、String;int、Int32;Boolean、bool的区别相关面试题,主要包含被问及string、String;int、Int32;Boolean、bool的区别时的应答技巧和注意事项,需要的朋友参考一下 String、Int32、Boolean等都属于.Net中定义的类, 而string、int、bool相当于C#中对这些类定义的别名。 CTS。
问题内容: 我很好奇为什么Golang不提供方法。从性能的角度来看,是否不会复制输入参数并增加成本(尽管由于字符串是不可变的,所以这看起来很奇怪,为什么要复制它们)? 我是Go的新手,不胜感激。 问题答案: 不是函数(或方法)调用,而是类型转换。 类型转换“本身”不会复制该值。但是将a转换为a 确实需要,因为结果字节片是 可变的 ,并且如果不进行复制,则可以修改/更改 不可变 的值(的内容),它必
本文向大家介绍详解C#中的string与String,包括了详解C#中的string与String的使用技巧和注意事项,需要的朋友参考一下 目录 小写 string 与大写 String 声明与初始化 string string 的不可变性 正则 string 与原义 string string 的转义序列 格式化字符串 操作子字符串 字符串的 null 与 ""(空) 可提高性能的 String