无法转换类型'字符'的值输入' String'在胁迫中

时间:2017-08-07 12:37:40

标签: swift string

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

let snailCharacter: Character = ""
let snailString = snailCharacter as String

但显然,它会产生错误:

  

无法转换类型'字符'的值输入' String'在胁迫中

解决方法是使用String这样的初始值设定项:

let snailString = String(snailCharacter)

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

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

2 个答案:

答案 0 :(得分:2)

查看documentation,您可以看到Character只是StringSwift的几种表示形式之一(重点是我添加到相关部分) )

  

字符串是一系列字符,例如“hello,world”或   “信天翁”。 Swift字符串由String类型表示。该   可以以各种方式访问​​String的内容,包括   字符值的集合。

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

Swift String类型的体系结构背后的关键原则之一是Unicode正确性,这是String不仅仅是{{1}数组的原因之一。 1}} S上。

有关CharacterString所做更改的详细信息,请参阅String Manifesto

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

从上面的解释中可以清楚地看出为什么类型转换在Swift4Character之间不起作用,因为这两种类型都不会相互继承。

对于桥接构建,这是Apple为某些StringSwift类型之间的互操作性而引入的方法,例如FoundationString,但由于{{1} }}和NSStringString类型,桥接转换也与此问题无关。

答案 1 :(得分:-2)

首先,你需要一个文本表示。您只能将String的描述转换为Character

let snailCharacter: Character = ""
let snailString = snailCharacter.description as String