为什么String.append不适用于像“foo \(bar)”这样的格式化字符串?

时间:2016-08-25 12:23:54

标签: swift swift3

在实施CustomStringConvertible时,我遇到了一个我不太明白的错误。

struct Name {
    let name: String?
}

extension Name: CustomStringConvertible {
    var description: String {
        var desc = ""
        if let name = name {
            desc.append("Page: \(name)")
        }
        return desc
    }
}

这会导致以下错误:

error: cannot invoke 'append' with an argument list of type '(String)'
note: overloads for 'append' exist with these partially matching parameter lists: (UnicodeScalar), (Character)

看起来编译器不知道要使用append函数的哪个实现。

将其更改为

desc.append(name)

工作正常。

desc.appendContentsOf("Page: \(name)")

为什么会这样?

1 个答案:

答案 0 :(得分:1)

Swift 2中, String有两个append方法,只需一个 字符或Unicode标量作为参数:

public mutating func append(c: Character)
public mutating func append(x: UnicodeScalar)

这就是desc.append("Page: \(name)")无法编译的原因 (并且desc.append(name)也没有编译)。但

public mutating func appendContentsOf(other: String)

附加另一个字符串。或者使用

desc += "Page: \(name)"

Swift 3中,这些方法已重命名为

public mutating func append(_ other: Character)
public mutating func append(_ other: UnicodeScalar)
public mutating func append(_ other: String)

然后它是

desc.append("Page: \(name)")