gpt4 book ai didi

swift - 将函数泛型参数约束为关联类型

转载 作者:行者123 更新时间:2023-11-30 10:05:32 25 4
gpt4 key购买 nike

为什么会失败并出现以下错误:函数声明行上的从非协议(protocol)、非类类型继承

protocol Foo {
associatedtype AType
}

struct Container<F: Foo> {

let foo: F

func doWork<S: F.AType>(s: S) { }
}

最佳答案

请注意以下编译:

protocol Foo {
associatedtype A
}

struct Container<F: Foo> {

func f(a: F.A) { }
}

但是,在以下情况下:

struct Container<F: Foo> {

func f<A : F.A>(a: A) { } // error: inheritance from non-protocol, non-class type
}

...类型 F.A 完全不受约束,因此它很可能是一个 Int,您无法使用 继承或遵守该类型>: 语法。

如果您确实需要比 (a: F.A) 更通用的解决方案,那么按照以下方式可能可以做到:

protocol Bar { }

protocol Foo {
associatedtype A : Bar
}

struct Container<F: Foo> {

func f<A : Bar>(a: A) { }
}

您现在可以使用 Bar 协议(protocol)表达对 a 参数的任何期望。

更好的是,您可以将该方法实现为 Foo 的扩展:

protocol Foo {
associatedtype A

func f(_: A) // if you want this to be a requirement
}

extension Foo /* where A is constrained so you can do something with it */ {

func f(a: A) { }
}

关于swift - 将函数泛型参数约束为关联类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36262894/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com