我正在撰寫一個決議庫 - 我有一種情況,我希望能夠將任何吐出字串列的決議器轉換成吐出字串的決議器 - 例如,我可以這樣說:
let parseWhitespace = Parse.any_of( " ", "\t").many().text()
于是我天真地寫道:
extension Parser
{
public func text() -> Parser<String> where T : [Character]
{
map( {String($0)} )
}
}
但這讓我很不高興 - 說“型別 T 受限于非協議非型別類”
后來有點谷歌搜索 - 我想出了最瘋狂的黑客,如下:
public protocol CharacterArray {}
extension Array : CharacterArray where Array.Element == Character
{
}
extension Parser
{
public func text() -> Parser<String> where T : CharacterArray
{
map( { String(($0 as? [Character])!) })
}
}
哪個有效。但這是荒謬的 - 也是最糟糕的 - 它有一個演員。有沒有什么方法可以在沒有演員表的情況下做到這一點?
uj5u.com熱心網友回復:
當您想將關聯型別約束為精確的具體型別時,請使用==代替:。
public func text() -> Parser<String> where T == [Character]
// ^^ instead of a colon
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/436433.html
上一篇:在iOS>=15上使狀態欄不透明
