在实施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)")
为什么会这样?
答案 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)")