当前位置: 首页 > 知识库问答 >
问题:

String插值与String级联的区别

宰父深
2023-03-14

当专门处理非可选的String值时,String内插和String串联之间的区别是什么?

struct MyModel {
    let value1: String
    let value2: String
    var displayNameByConcatenation: String {
        return value1 + "-" + value2
    }
    var displayNameByInterpolation: String {
        return "\(value1)-\(value2)"
    }
}
  • 是否有任何情况下,displayNameByConcatenationdisplayNameByInterpolation是不同的?比如长unicode字符串
  • 在上面的例子中,是否有可能以某种方式覆盖操作符的行为或插值的行为,使它们不同
  • 一个比另一个快/慢吗

请注意,从这个问题中,我们了解到字符串插值将使用CustomStringConvertible的描述。但是字符串串联(运算符)是否也调用描述

共有3个答案

宗政斌
2023-03-14

“串联允许您将多个字符串组合在一起,它只适用于两个字符串。”

更新。不确定Swift的早期版本允许使用什么,但目前您可以在同一语句中将两个以上的字符串连接在一起:

let str=“嗨,我的名字是”

var concat=str“2”“3”“4”“5”works”//displays“嗨,我的名字是2345 works”

因为的两个操作数都必须是字符串,所以如果要向字符串中添加数字,则必须做一些额外的工作:

var concat2=str String(2)//显示“嗨,我的名字是2”

插值而非串联的原因,这里引用了苹果公司的插值简介:“字符串插值是一种从常数、变量、文字和表达式的组合中构造新字符串值的方法”。换句话说,你可以使用数字、布尔等的插值,而无需先将它们转换为字符串,如果使用串联,就必须这样做。

淳于博文
2023-03-14

字符串插值:

  • 少打字
  • 内部调用字符串
  • 在运行时更快

一个缺点:

  • 划定字符串

插值和串联都有自己的优点和缺点

需要使用与预定义字符串的连接来获得更好的性能

莘聪
2023-03-14

从速度的角度来看,要区分串联(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