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

时间:2015-01-17 02:51:55

标签: generics swift

看一下以下假设代码:

class Stream<S: SequenceType where S.Generator.Element: Character> {
    init(_ sequence: S) {}
}

不编译。我得到“S.Generator.Element约束到非协议类型字符”。这真是个无赖,男人。我想到了两种可能性:

class Stream<S: SequenceType where S.Generator.Element: ExtendedGraphemeClusterLiteralType> {
}

此约束有效,因为Character是我所知道的唯一实现该协议的方法。问题是现在我有一个ExtendedGraphemeClusterLiteralType而不是Character所以我被迫施展,我可以忍受。

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

1 个答案:

答案 0 :(得分:12)

尝试:

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