在Swift中,我希望以下内容是完全有效的代码:
let snailCharacter: Character = ""
let snailString = snailCharacter as String
但显然,它会产生错误:
无法转换类型'字符'的值输入' String'在胁迫中
解决方法是使用String
这样的初始值设定项:
let snailString = String(snailCharacter)
我认为Character
是String
的一个子集,所以这让我感到惊讶。为什么禁止将Character
投射到String
?
我在Xcode 9 beta 4中使用Swift 4。
答案 0 :(得分:2)
查看documentation,您可以看到Character
只是String
中Swift
的几种表示形式之一(重点是我添加到相关部分) )
字符串是一系列字符,例如“hello,world”或 “信天翁”。 Swift字符串由String类型表示。该 可以以各种方式访问String的内容,包括 字符值的集合。
在Swift
中,String
不仅仅是Character
的数组,与其他语言不同。在Swift
中,Character
只是以某种方式表示String
实例的一种方式。可以使用String
来表示View
,例如CharacterView
,utf8View
等。
Swift
String
类型的体系结构背后的关键原则之一是Unicode正确性,这是String
不仅仅是{{1}数组的原因之一。 1}} S上。
有关Character
中String
所做更改的详细信息,请参阅String Manifesto。
更具体地说明为什么铸造不起作用。有两种铸件,铸造和铸造。类型转换只能在涉及继承的类之间进行。您可以将子类向上转换为其超类,该子类总是成功,或者您可以尝试将超类向下转换为子类,这仅在子类实例首次上传到其超类时才有效。
从上面的解释中可以清楚地看出为什么类型转换在Swift4
和Character
之间不起作用,因为这两种类型都不会相互继承。
对于桥接构建,这是Apple为某些String
和Swift
类型之间的互操作性而引入的方法,例如Foundation
和String
,但由于{{1} }}和NSString
是String
类型,桥接转换也与此问题无关。
答案 1 :(得分:-2)
首先,你需要一个文本表示。您只能将String
的描述转换为Character
let snailCharacter: Character = ""
let snailString = snailCharacter.description as String