无法在强制转换中将“字符”类型的值转换为“字符串”类型

Rob*_*bok 7 string swift

在 Swift 中,我希望以下是一个完全有效的代码:

let snailCharacter: Character = ""
let snailString = snailCharacter as String
Run Code Online (Sandbox Code Playgroud)

但显然,它产生了一个错误:

无法在强制转换中将“字符”类型的值转换为“字符串”类型

解决方案是使用这样的String初始化程序:

let snailString = String(snailCharacter)
Run Code Online (Sandbox Code Playgroud)

我认为Character是 的一个子集String,这让我感到惊讶。为什么禁止投射CharacterString

我在 Xcode 9 beta 4 中使用 Swift 4。

Dáv*_*tor 4

查看文档,您可以看到,这只是inCharacter的几种表示之一(重点是我添加到相关部分的)StringSwift

字符串是一系列字符,例如“hello, world”或“albatross”。Swift 字符串由 String 类型表示。可以通过多种方式访问​​字符串的内容,包括作为字符值的集合。

与其他一些语言不同,在 中SwiftString不仅仅是 s 的数组。CharacterIn Swift,Character只是以String某种方式表示实例的一种方式。Strings可以用Views来表示,如CharacterViewutf8View等。

Swifts类型架构背后的关键原则之一是 Unicode 正确性,这也是s 不仅仅是简单的数组的String原因之一。StringCharacter

String有关in更改的更多信息Swift4,请参阅String Manifesto

更具体地说明为什么铸造不起作用。铸件有型式铸造和桥式铸造两种。类型转换只能在涉及继承的类之间进行。您可以将子类向上转换为其超类,这总是成功的,也可以尝试将超类向下转换为子类,这仅在子类实例首先向上转换为其超类时才有效。

Character从上面的解释应该很清楚为什么类型转换在和 之间不起作用String,因为这两种类型都不会互相继承。

Swift对于桥接转换,这是 Apple 为某些和类型之间的互操作性而引入的方法Foundation,例如StringNSString,但由于 和String都是Character类型Swift,因此桥接转换也与此问题无关。