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中分辨出哪一个是什么意思。但事实就是如此。