这个问题具体是关于将Character类型的Array转换为String.将字符串数组或数字转换为字符串不是此处讨论的主题.
在以下两行中,我希望myStringFromArray设置为"C,a,t!".
var myChars: [Character] = ["C", "a", "t", "!", ""]
let myStringFromArray = myChars.joinWithSeparator(",");
Run Code Online (Sandbox Code Playgroud)
但是,我无法执行该代码,因为编译器抱怨"对成员的模糊引用joinWithSeparator".
那么,有两个问题:
1)Apple说,
"Swift的字符类型的每一个实例都表示单个扩展字形集群.一个扩展字形簇是(当组合时)产生单一人类可读字符的一个或多个标量的Unicode的序列".
对我来说,这听起来至少是同质的,认为实现joinWithSeparator支持Character类型的方法是合理的.所以,有没有人有一个很好的答案,为什么他们不这样做?
2)在Swift中将类型字符数组转换为字符串的最佳方法是什么?
注意:如果您不想在字符之间使用分隔符,则解决方案是:
let myStringFromArray = String(myChars)
Run Code Online (Sandbox Code Playgroud)
这会给你"猫!"
对我来说,这听起来至少是同质的,认为实现joinWithSeparator方法以支持Character类型是合理的.所以,有没有人有一个很好的答案,为什么他们不这样做?
这可能是对设计的疏忽.发生此错误是因为有两种可能的候选者joinWithSeparator(_:).我怀疑这种歧义是存在的,因为Swift可以隐含地将双引号解释为String或者Character.在这种情况下,选择哪一个是模棱两可的.
第一个候选人是joinWithSeparator(_: String) -> String.它做你想要的.
如果将分隔符视为a String,则会选择此候选项,结果为:"C,a,t,!,"
第二是joinWithSeparator<Separator : SequenceType where Separator.Generator.Element == Generator.Element.Generator.Element>(_: Separator) -> JoinSequence<Self>.这就是所谓的上Sequence的SequenceS,并赋予了Sequence作为一个分隔符.方法签名有点令人满意,所以让我们分解它.此函数的参数是Separator类型.这Separator被约束为SequenceTypesequence(Seperator.Generator.Element)的元素必须与此序列序列(Generator.Element.Generator.Element)的元素具有相同类型的位置.
复杂约束的关键是确保Sequence保持同质.例如,您无法连接序列的Int序列Double.
如果将分隔符视为a Character,则会选择此候选项,结果为:["C", ",", "a", ",", "t", ",", "!", ",", ""]
编译器会抛出错误以确保您意识到存在歧义.否则,程序的行为可能与您预期的不同.
您可以通过明确地将每个Character变为a 来消除歧义String.因为String是不是一SequenceType,二期候选人不再是可能的.
var myChars: [Character] = ["C", "a", "t", "!", ""]
var anotherVar = myChars.map(String.init).joinWithSeparator(",")
print(anotherVar) //C,a,t,!,
Run Code Online (Sandbox Code Playgroud)