0

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

struct MyModel { 
    let value1: String 
    let value2: String 
    var displayNameByConcatenation: String { 
     return value1 + "-" + value2 
    } 
    var displayNameByInterpolation: String { 
     return "\(value1)-\(value2)" 
    } 
} 
  • 是否有将要在那里displayNameByConcatenationdisplayNameByInterpolation不同的案例?就像长Unicode字符串一样?
  • 是否有可能以某种方式覆盖运算符+的行为或插值的行为使它们在上例中不同?
  • 比另一个更快/更慢吗?

请注意,从this question我们知道字符串插值将使用CustomStringConvertible的description。但String串联(运营商+)也调用description

+0

我认为我们可以有把握地假设'一*字符串description' *返回字符串本身,这意味着没有什么区别。 –

+0

你试过重写'+'吗?你测量过速度了吗? –

+0

@MartinR速度测试完成后,使用CharacterSet的一些代码来获得乐趣。 –

回答

0

从一个速度点,区分级联(value1 + "-" + value2)和插值("\(value1)-\(value2)"),这里有我在iPhone 6的结果:

concatenation: 0.0225991666084155 
interpolation: 0.0346928749931976 

基于这些结果,串联更快。

自己尝试一下:

import UIKit 

class ViewController: UIViewController { 
    override func viewDidAppear(_ animated: Bool) { 
     super.viewDidAppear(animated) 

     DispatchQueue.global(qos: .default).async { 
      ViewController.buildDataAndTest() 
     } 
    } 

    private static func buildDataAndTest() { 
     let characterSet = CharacterSet.alphanumerics 
     characterSet.cacheAllCharacters() 
     let data: [(String, String)] = (0...10_000).map { _ in 
      (characterSet.randomString(length: 72), characterSet.randomString(length: 36)) 
     } 
     _ = 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 = allCharacters() 
    } 

    public func allCharacters() -> [Character] { 
     var allCharacters = [Character]() 
     for plane: UInt8 in 0 ... 16 where hasMember(inPlane: plane) { 
      for unicode in UInt32(plane) << 16 ..< UInt32(plane + 1) << 16 { 
       if let uniChar = UnicodeScalar(unicode), contains(uniChar) { 
        allCharacters.append(Character(uniChar)) 
       } 
      } 
     } 
     return allCharacters 
    } 

    // 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 
    } 
} 
0

字符串插值:

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

一个缺点:

  • 分隔您的字符串

既插和串联都有自己的优势和劣势

需要使用串联与预定义的字符串,以获得更好的性能

+0

所以字符串插值更快?是来自测试,来自文档还是逻辑推理?如果其动态字符串插值由于测试而更快,则返回 –

+0

。 你可以在插值上使用数字,枚举等 – Nattudurai

0

“级联可以让你结合字符串连接在一起,它仅适用于两个字符串“。

更新。不知道什么早期版本的雨燕允许的,但现在你可以在同一个语句级连在一起超过2个字符串:

令海峡=“嗨,我的名字是”

VAR CONCAT = STR +“2” +“3”+“4”+“5”+“works”//显示“嗨,我的名字是2345作品”

因为+的两个操作数都需要是字符串,所以你必须做一些额外的工作如果你想添加一个数字到字符串:

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

插值而不是连接的原因,下面是Apple插入插值的引用:“字符串插值是一种从常量,变量,文字和表达式混合构造新字符串值的方法”换句话说,您可以使用插入数字,布尔值等,而不必先将它们转换为字符串,如果使用串联,则必须执行此操作。

级联和插值

级联作品用绳子只有

让海峡之间不同的= “嗨,”

让anotherString = “我的名字是”

让利myName = str + anotherString

输出:嗨,我的名字是

插值 斯威夫特使用字符串插值包括 一个常数或变量作为一个更长的字符串的占位符 的名称,并提示斯威夫特与当前替换 它该常数或变量的值。

let temp = 52 let temperatureDisplay =“当前温度为(temp)华氏温度”。

//也可以使用串内插替换表达式的评估

让celciusTempDisplay = “当前温度是((TEMP-30)/ 2)摄氏度。”

+0

这似乎是Pasan Premaratne在这里找到的帖子的直接引用。 https://teamtreehouse.com/community/what-is-the-difference-between-concatenation-and-interpolation-it-seems-like-you-can-do-the-exact-same-thing-with-both –

相关问题