gpt4 book ai didi

swift - 通用工厂方法和类型推断

转载 作者:搜寻专家 更新时间:2023-11-01 06:40:29 24 4
gpt4 key购买 nike

我有以下带有通用工厂方法的类:

final class Something<T> {

let value: T

init(initial: T) {
value = initial
}

}

extension Something {

class func zip<A, B>(_ a: A, _ b: B) -> Something<(A, B)> {
let initial = (a, b)
return Something<(A, B)>(initial: initial)
}

}

如果没有明确指定返回类型,为什么我不能调用 zip

// ERROR: Cannot invoke `zip` with an argument list of type `(Int, Int)`
let y = Something.zip(1, 2)

// OK: Works but it’s unacceptable to require this on caller's side
let x = Something<(Int, Int)>.zip(1, 2)

感谢您的宝贵时间!

最佳答案

你看到这个的原因是这个调用中没有任何内容:

let y = Something.zip(1, 2)

这告诉 Swift 什么 T应该是。

您的调用隐式指定了 A 的内容和 B应该是,并指定方法应该返回Something<A, B> .但是那个Something<A, B>未连接到 Something<T> .

事实上,您的通话中根本没有连接到 T ; T没有指定,所以它可以是任何东西。我的意思是从字面上看——你实际上可以在 Something 之后的尖括号中放置(几乎)任何随机类型。它的工作原理完全一样:

let y = Something<UICollectionViewDelegateFlowLayout>.zip(1, 2)

您真正想做的是以某种方式指定 T必须是一个元组,并且两个参数与元组的元素具有相同的类型。不幸的是,Swift 目前不具备正确执行此操作所需的功能。如果语言更复杂,你可以这样说:

extension<A, B> Something where T == (A, B) {
class func zip(a: A, _ b: B) -> Something {
let initial = (a, b)
return Something(initial: initial)
}
}

但是现在,您将不得不应付这个可怕的黑客攻击,它通过毫无意义地重复使用 T 来工作。键入参数,使其不再松散:

extension Something {
class func zip<B>(a: T, _ b: B) -> Something<(T, B)> {
let initial = (a, b)
return Something<(T, B)>(initial: initial)
}
}

关于swift - 通用工厂方法和类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36061561/

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