Generics 如何将Swift协议约束为具体类型?

Generics 如何将Swift协议约束为具体类型?,generics,swift,Generics,Swift,看看下面的假设代码: class Stream<S: SequenceType where S.Generator.Element: Character> { init(_ sequence: S) {} } 类流{ init(u序列:S){} } 不编译。我得到“S.Generator.Element约束为非协议类型字符”。老兄,这真是糟糕透了。我想到了两种可能性: class Stream<S: SequenceType where S.Generator.El

看看下面的假设代码:

class Stream<S: SequenceType where S.Generator.Element: Character> {
    init(_ sequence: S) {}
}
类流{
init(u序列:S){}
}
不编译。我得到“S.Generator.Element约束为非协议类型字符”。老兄,这真是糟糕透了。我想到了两种可能性:

class Stream<S: SequenceType where S.Generator.Element: ExtendedGraphemeClusterLiteralType> {
}
类流{
}
这个约束之所以有效,是因为
字符
是我所知道的实现该协议的唯一方法。问题是,现在我有了一个
extendedGraphimeClusterLiteralType
,而不是
字符
,所以我不得不施放,我可以接受


另一种可能是定义我自己的协议,例如,
CharacterType
,并让
Character
通过扩展实现。(这可能也更安全。)这可能是我实际采用的方法,但我想知道除了这个方法之外,是否还有人知道如何绕过这个限制?

试试:

class Stream<S: SequenceType where S.Generator.Element == Character> {
//                                                     ^^
    init(_ sequence: S) {}
}
类流{
//                                                     ^^
init(u序列:S){}
}

“另一种可能是定义我自己的协议,例如CharacterType,并让Character通过扩展实现它”。这就是我要建议的。我测试过了,效果很好。我不明白你为什么认为这是一个“限制”。就限制而言,这并不可怕。但最好避免在理论上可能失败的演员阵容,即使在实践中这是永远不会发生的,我被Haskell和C#等允许这样做的语言宠坏了。例如,C#中的等效词是
IEnumerable
。我正在探索一些想法,但我觉得我不会成功(正如许多人所说,斯威夫特不是哈斯凯尔……它不仅不是哈斯凯尔,而且还处于1.0(尽管我认为“1.0”对他们有点乐观).我真的希望Swift 2.0能解决打字系统中的一些痛点。这是我和我的心理医生之间经常谈论的话题。我看起来也很傻,但我不在乎。我真的从中学到了一些东西,我真的很高兴它发生了。哦!我不敢相信它这么简单。我真的觉得有点傻。不,不,我告诉过你Rintaro会知道的!我想我跳过了swift基础课程太早了!你能详细解释一下为什么
不起作用而
==
起作用吗?@GoodSp33d我想它可以总结为
表示“实现”,而
==
表示“是(的子类型)”我不明白他们为什么要区分,因为编译器总是能从RHS中分辨出哪一个是什么意思。但事实就是如此。