swift 将泛型函数限制为非协议类型而不强制转换
swift constrain generic function to non-protocol type without casting
我正在编写一个解析库 - 我有一种情况,我希望能够将任何吐出字符列表的解析器转换为吐出字符串的解析器 - 例如,这样我就可以说类似的话:
let parseWhitespace = Parse.any_of( " ", "\t").many().text()
所以我天真地写道:
extension Parser
{
public func text() -> Parser<String> where T : [Character]
{
map( {String([=12=])} )
}
}
但这让我很生气 - 说“类型 T 受限于非协议非类型 class”
稍后使用谷歌搜索 - 我想到了最疯狂的技巧,如下所示:
public protocol CharacterArray {}
extension Array : CharacterArray where Array.Element == Character
{
}
extension Parser
{
public func text() -> Parser<String> where T : CharacterArray
{
map( { String(([=13=] as? [Character])!) })
}
}
有效。但这是荒谬的 - 最糟糕的是 - 它有一个演员。有什么办法可以不用演员表吗?
当您想将关联类型限制为精确的具体类型时,您可以使用 ==
而不是 :
。
public func text() -> Parser<String> where T == [Character]
// ^^ instead of a colon
我正在编写一个解析库 - 我有一种情况,我希望能够将任何吐出字符列表的解析器转换为吐出字符串的解析器 - 例如,这样我就可以说类似的话:
let parseWhitespace = Parse.any_of( " ", "\t").many().text()
所以我天真地写道:
extension Parser
{
public func text() -> Parser<String> where T : [Character]
{
map( {String([=12=])} )
}
}
但这让我很生气 - 说“类型 T 受限于非协议非类型 class”
稍后使用谷歌搜索 - 我想到了最疯狂的技巧,如下所示:
public protocol CharacterArray {}
extension Array : CharacterArray where Array.Element == Character
{
}
extension Parser
{
public func text() -> Parser<String> where T : CharacterArray
{
map( { String(([=13=] as? [Character])!) })
}
}
有效。但这是荒谬的 - 最糟糕的是 - 它有一个演员。有什么办法可以不用演员表吗?
当您想将关联类型限制为精确的具体类型时,您可以使用 ==
而不是 :
。
public func text() -> Parser<String> where T == [Character]
// ^^ instead of a colon