gpt4 book ai didi

swift - 实现泛型协议(protocol)方法但对整个类使用泛型

转载 作者:行者123 更新时间:2023-12-01 13:12:58 24 4
gpt4 key购买 nike

我正在尝试实现一个具有泛型参数的协议(protocol)方法,然后为我的整个类使用泛型类型,而不是仅仅在方法上,就像这样

protocol FirstProtocol {
}

protocol SecondProtocol {
func foo<T: FirstProtocol>(argument: T)
}

class MyType<T: FirstProtocol>: SecondProtocol {
var value: T? = nil
func foo<T>(argument: T) {
value = argument // ERROR: Cannot assign value of type 'T' to type 'T?'
}
}

所以 swift 编译器接受 foo<T>(argument:T)匹配 SecondProtocol 的方法,如果我注释掉错误行它编译正常,但它不会让我将 argument 分配给 value 即使 value argument 应该是相同的类型,编译器会提示它们好像是不同的类型。

最佳答案

argument 的类型和value 确实是不同的类型。 foo 中的 T 泛型参数只是一个标识符,我可以将其更改为任何其他内容:

class MyType<T: FirstProtocol>: SecondProtocol {
var value: T? = nil
func foo<AnythingElse>(argument: AnythingElse) {
// MyType still conforms to SecondProtocol
}
}

foo中的T是一个全新的泛型参数,不同于MyType中的T。他们恰好同名。

请注意,当您声明泛型方法时,决定泛型类型的是调用者,而不是泛型方法。 foo 在这里想说的是“我希望 foo 中的 TT 的类型相同> 在 MyType” 中,但它不能这样说它自己的通用参数!

修复它的一种方法是使 SecondProtocol 具有关联类型:

protocol SecondProtocol {
// name this properly!
associatedtype SomeType: FirstProtocol
func foo(argument: SomeType)
}

class MyType<T: FirstProtocol>: SecondProtocol {
typealias SomeType = T // here is where it says "I want 'SomeType' to be the same type as 'T'!"
var value: T? = nil
func foo(argument: T) {
value = argument
}
}

关于swift - 实现泛型协议(protocol)方法但对整个类使用泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58947949/

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