有人可以解释一下这句话有什么问题。
var someString = "Welcome"
someString.append("!")
然而,当我用,
替换代码时,这是有效的var someString = "Welcome"
let exclamationMark : Character = "!"
someString.append(exclamationMark)
提前致谢
答案 0 :(得分:5)
在Swift中,没有字符文字(例如C语言中的'c'
),只有String
个文字。
然后,您在String
上定义了两个函数:append
,附加单个字符,extend
附加整个字符串。所以这有效:
var someString = "Welcome"
someString.extend("!")
如果您真的想使用append
,可以通过调用String
'强制将一个字符Character
文字转换为Character
。构造函数:
someString.append(Character("!"))
或使用类型转换:
someString.append("!" as Character)
或使用类型注释,就像使用额外变量一样:
let exclamationMark: Character = "!"
someString.append(exclamationMark)
答案 1 :(得分:0)
String
有2个重载append(_:)
mutating func append(x: UnicodeScalar)
mutating func append(c: Character)
Character
和UnicodeScalar
符合UnicodeScalarLiteralConvertible
enum Character : ExtendedGraphemeClusterLiteralConvertible, Equatable, Hashable, Comparable {
/// Create an instance initialized to `value`.
init(unicodeScalarLiteral value: Character)
}
struct UnicodeScalar : UnicodeScalarLiteralConvertible {
/// Create an instance initialized to `value`.
init(unicodeScalarLiteral value: UnicodeScalar)
}
在这种情况下, "!"
是UnicodeScalarLiteral
。因此,编译器无法确定"!"
是Character
还是UnicodeScalar
,以及应该调用哪个append(_:)
方法。这就是你必须明确指定它的原因。
您可以看到:"!"
可以是此代码的UnicodeScalar文字:
struct MyScalar: UnicodeScalarLiteralConvertible {
init(unicodeScalarLiteral value: UnicodeScalar) {
println("unicode \(value)")
}
}
"!" as MyScalar // -> prints "unicode !"