2017-08-07 84 views
2

在斯威夫特,我希望下面的是一个完全有效的代码:无法将类型“字符”的值强制输入“串”

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

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

Cannot convert value of type 'Character' to type 'String' in coercion

解决方案是使用String初始化像这样:

let snailString = String(snailCharacter) 

我想CharacterString的子集,所以让我感到惊讶。为什么禁止将Character转换成String

我在Xcode 9 beta 4版本

+1

“String”是“Character”的集合。你不能投射,因为那是不同的类型。 –

+1

这只是一个设计决定,所以只有设计Swift的人才能解释原因。在Swift标准库中,“字符”被设计成与“字符串”完全不同的东西,它具有用于保存单个BMP字符的高效内部表示。因此,'Character'和'String'之间的关系不符合'as-casting'提供的任何情况: - 上传,桥接,注释文字类型,消除重载函数的歧义。 'Int8'可以被认为是'Int16'的一个子集,但是不能用'as'-casting来将'Int8'转换为'Int16'。 – OOPer

回答

2

望着documentation,你可以看到,Character只是在SwiftString的几次交涉中的一个(加着重号的相关部分我)

A string is a series of characters, such as "hello, world" or "albatross". Swift strings are represented by the String type. The contents of a String can be accessed in various ways, including as a collection of Character values.

SwiftString不仅是一个不同于其他一些语言的Character列数组。在Swift中,Character只是以某种方式表示String实例的一种方式。 String S可使用View S,如CharacterViewutf8View

一个SwiftString类型的体系结构背后的关键原理是Unicode的正确性,这是原因之一String s为不仅表示只是一排Character s。

有关StringSwift4中更改的更多信息,请参阅String Manifesto

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

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

桥梁浇注,这是一种方法,苹果公司推出了一些SwiftFoundation类型,如StringNSString之间的互操作性,但由于双方StringCharacterSwift类型,桥铸造无关这个问题无论是。

+0

它解释了为什么它不能被铸造? –

+0

@RoboRobok为了清晰起见,我增加了一些要点,现在检查我的答案,并告诉我它是否足够清楚。 –

-2

首先使用雨燕4,你需要的是一个文字表述。你可以转换为String只有Character的描述是这样

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

对不起,但这是错误的。 'description'属性意味着代表调试变量,在这种情况下使用它只是因为它是'String'不是一个好主意。另外,这已经是一个'String'了,所以你的'as String'是多余的。 –

+2

问题是关于这种铸件禁止背后的推理*,而不是关于转换本身的方式。 – the4kman

相关问题