尝试在闭包中使用泛型时发生意外的编译器错误

麦克风

给定没有任何功能的协议:

protocol NonFunkyProtocol {}

以及一个带有严重缺陷的协议:

protocol FunkyProtocol {
    func funky<T: NonFunkyProtocol>(_ closure: (T) -> Void)
}

然后给出这个结构:

struct WeeStruct: FunkyProtocol {
    let weeProp: NonFunkyProtocol
    
    func funky<T>(_ closure: (T) -> Void) where T: NonFunkyProtocol {
        closure(weeProp)
    }
}

我希望将其编译为预期的参数类型closure为T,其中T符合NonFunkyProtocol,并且weeProp类型为NonFunkyProtocol。

相反,我看到此错误:

错误

我的仿制药知识中很可能有一个漏洞,我在哪里出错?

罗布·纳皮尔

问题是T在这种情况下是“某种符合NonFunkyProtocol”的类型weeProp也是“符合的东西NonFunkyProtocol”,但是没有什么可以说weeProp是那种T

考虑以下情况:

extension Int: NonFunkyProtocol {}
extension String: NonFunkyProtocol {}

Int和String都符合。

现在,我用一个字符串构造一个WeeStruct:

let wee = WeeStruct(weeProp: "")

funky使用需要一个Int的函数进行调用(因为Int是一个符合类型,所以可以是T):

wee.funky { (int: Int) -> Void in print(int + 1) }

因此,这将传递""给闭包。那怎么行?

因此,您要么需要任何 关闭句柄NonFunkyProtocol(我就强烈怀疑这是您的意思):

func funky(_ closure: (NonFunkyProtocol) -> Void)

或者你需要向下钉weePropT通过使T一个associatedtype:

protocol FunkyProtocol {
    associatedtype T: NonFunkyProtocol
    func funky(_ closure: (T) -> Void)
}

struct WeeStruct<T:NonFunkyProtocol>: FunkyProtocol {
    let weeProp: T

    func funky(_ closure: (T) -> Void) {
        closure(weeProp)
    }
}

不过,在添加关联类型之前,我会非常小心。这完全改变了FunkyProtocol的性质。

如果FunkyProtocol确实只是这一要求,那么您还应该问它要解决的是什么,而不仅仅是功能。WeeStruct当您可以直接使用该wee.funky功能时,为什么要随身携带所有协议包呢?FunkyProtocol上有协议扩展吗?如果您不能针对FunkyProtocol编写通用算法,则可能不应该是协议。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

编译Linux内核4.4.0时发生意外错误

泛型类中发生意外的类型编译错误,它可能有哪些参数?

在Blazor中使用JsonPatchDocument发生意外错误

使用效果包循环glmer函数时发生意外错误

为新类定义S3“数学”组泛型时发生意外的log2错误

尝试将数据帧与分类数据连接时发生意外错误

尝试使用函数中定义的数据框名称时发生意外的NameError

尝试使用String.split(“ \\?”)时发生意外行为

在Firebase上部署WebApp时发生意外错误

删除对象时发生意外的类型错误

Anaconda:Navigator启动时发生意外错误

在Java 8中使用Lambda发生意外错误

在d3js中使用CSS Calc时发生意外过渡

使用Jest发生意外的保留字错误

使用 Ansible 为 set_fact 赋值时发生意外模板类型错误

使用ORDER BY时发生意外行为-星期几以错误的顺序打印

在我的 Wix 站点上使用 API 接收时发生意外错误

登录错误:发生意外错误

使用graphql时发生意外的<EOF>

使用提取时发生意外的令牌反应

使用ostringstream时发生意外行为

使用Comparator.comparing(HashMap :: get)作为比较器时发生意外行为

尝试在两个Keycloak之间联合用户时发生意外错误(令牌的访问者错误)

TCP插件发生意外错误

与Stripe发生意外错误

)此时发生意外错误

Eclipse-尝试安装M2E连接器时发生意外异常

在Karma单元测试中使用ui-router和指令时发生意外的GET

Java泛型-编译器错误