【发布时间】:2015-04-14 06:29:58
【问题描述】:
谁能解释一下这句话有什么问题。
var someString = "Welcome"
someString.append("!")
但是,当我将代码替换为时,这会起作用,
var someString = "Welcome"
let exclamationMark : Character = "!"
someString.append(exclamationMark)
提前致谢
【问题讨论】:
谁能解释一下这句话有什么问题。
var someString = "Welcome"
someString.append("!")
但是,当我将代码替换为时,这会起作用,
var someString = "Welcome"
let exclamationMark : Character = "!"
someString.append(exclamationMark)
提前致谢
【问题讨论】:
在 Swift 中,没有字符字面量(例如 C 派生语言中的 'c'),只有 String 字面量。
然后,您在Strings 上定义了两个函数:append,用于附加单个字符,extend,用于附加整个字符串。所以这行得通:
var someString = "Welcome"
someString.extend("!")
如果您真的想使用append,您可以通过调用Character 的构造函数来强制将单字符String 文字转换为Character:
someString.append(Character("!"))
或使用类型转换:
someString.append("!" as Character)
或者像使用额外变量一样使用类型注释:
let exclamationMark: Character = "!"
someString.append(exclamationMark)
【讨论】:
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 !"
【讨论】:
"!" 实际上是一个包含单个 Unicode 标量值的 String 文字。 UnicodeScalarLiteralConvertible 的标头 cmets 声明:“可以使用包含单个 Unicode 标量值的字符串文字来初始化符合类型”。
"!" 恰好不是 UnicodeScalar,否则someString.append("!") 会立即编译。