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 –

相關問題