gpt4 book ai didi

swift - 如何约束泛型函数关联类型

转载 作者:可可西里 更新时间:2023-11-01 01:07:54 25 4
gpt4 key购买 nike

我正在尝试采用两个具有相同关联类型并返回相同类型的协议(protocol),但运气不佳。

protocol MyProtocol {
associatedtype AssociatedType
}

func myFunc<T: MyProtocol, R: MyProtocol>(arg: T) -> R
where T.AssociatedType == R.AssociatedType {
return arg //Error-> Cannot convert return expression of type 'T' to return type 'R'
}

在 Swift 中可以实现这样的功能吗?

最佳答案

两种类型(称它们为 TR )不一定等同,只是因为它们遵循相同的协议(protocol)并使用相同的关联类型。

根据这个推理,Array<Int>Set<Int>相同, 并且应该可以自由互换,因为它们都符合 Collection Element在哪里是Int .

这是另一个反例:

protocol MyProtocol {
associatedtype AssociatedType

init()
}

protocol MySubProtocol1: MyProtocol where AssociatedType == Int {}
protocol MySubProtocol2: MyProtocol where AssociatedType == Int {}

struct S1: MySubProtocol1 {}
struct S2: MySubProtocol2 {}

func myFunc<T: MyProtocol, R: MyProtocol>(arg: T) -> R
where T.AssociatedType == R.AssociatedType {
return arg as! R // Let's see what would happen. Don't do this!
}

func produce<T: MySubProtocol1>(type: T.Type) -> T {
return T()
}

func consume<T: MySubProtocol2>(arg: T, ofType: T.Type) {
print(arg)
}

consume(arg: myFunc(arg: produce(type: S1.self)), ofType: S2.self)

Terminated due to signal: ABORT TRAP (6)

Could not cast value of type 'main.S1' (0x100e44210) to 'main.S2' (0x100e44228).

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

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