Разница между строковой интерполяцией и инициализатором строки в Swift

Я могу читать int, float, double как строку с использованием строковой интерполяции или инициализатора строки. результат всегда один и тот же.

var a: Int = 2

var c: Character = "e"

var d: String = "\(a)\(c)"

OR

var d: String = String(a) + String(c)

результат такой же. d имеет значение "2e"

Единственное отличие, которое я обнаружил, это то, что строка интерполяции() может использоваться внутри двойных кавычек, тогда как String() не может использоваться внутри двойных кавычек.

Это все? Я что-то пропустил?

Ответ 1

Интерполяция строк "\(item)" дает результат вызова description элемента. String(item) вызывает инициализатор String и возвращает значение String, которое часто совпадает с String, которое вы получите из строковой интерполяции, но оно не гарантируется.

Рассмотрим следующий надуманный пример:

class MyClass: CustomStringConvertible {
    var str: String

    var description: String { return "MyClass - \(str)" }

    init(str: String) {
        self.str = str
    }
}

extension String {
    init(_ myclass: MyClass) {
        self = myclass.str
    }
}

let mc = MyClass(str: "Hello")
String(mc)  // "Hello"
"\(mc)"     // "MyClass - Hello"