如何将 Swift 协议限制为具体类型?
How can I constrain a Swift protocol to a concrete type?
看看下面的假设代码:
class Stream<S: SequenceType where S.Generator.Element: Character> {
init(_ sequence: S) {}
}
不编译。我得到 "S.Generator.Element constrained to non-protocol type Character"。这是一个无赖,伙计。我想到了两种可能性:
class Stream<S: SequenceType where S.Generator.Element: ExtendedGraphemeClusterLiteralType> {
}
此约束有效,因为 Character
是我所知道的唯一实现该协议的东西。问题是现在我有一个 ExtendedGraphemeClusterLiteralType
而不是 Character
所以我被迫投射,我可以忍受。
另一种可能性是定义我自己的协议,例如 CharacterType
,并让 Character
通过扩展实现它。 (这可能也更安全。)这可能是我实际会采用的方法,但我想知道是否有人知道除此之外的其他方法来解决此限制?
尝试:
class Stream<S: SequenceType where S.Generator.Element == Character> {
// ^^
init(_ sequence: S) {}
}
看看下面的假设代码:
class Stream<S: SequenceType where S.Generator.Element: Character> {
init(_ sequence: S) {}
}
不编译。我得到 "S.Generator.Element constrained to non-protocol type Character"。这是一个无赖,伙计。我想到了两种可能性:
class Stream<S: SequenceType where S.Generator.Element: ExtendedGraphemeClusterLiteralType> {
}
此约束有效,因为 Character
是我所知道的唯一实现该协议的东西。问题是现在我有一个 ExtendedGraphemeClusterLiteralType
而不是 Character
所以我被迫投射,我可以忍受。
另一种可能性是定义我自己的协议,例如 CharacterType
,并让 Character
通过扩展实现它。 (这可能也更安全。)这可能是我实际会采用的方法,但我想知道是否有人知道除此之外的其他方法来解决此限制?
尝试:
class Stream<S: SequenceType where S.Generator.Element == Character> {
// ^^
init(_ sequence: S) {}
}