gpt4 book ai didi

swift - 静态 Var 闭包返回 Type.Type 而不是 Type

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

我尝试在另一个类中打断、计数然后加入对象。所以我构建协议(protocol):

typealias DataBreaker<T> = () -> [Double]
typealias DataJoiner<T> = (_ particles: [Double]) -> T

protocol SpaceIntepolatable {
associatedtype Atom
var breaker:DataBreaker<Atom> {get}
static var joiner:DataJoiner<Atom> {get}
}

并为 Point 构建一个扩展:

extension Point:SpaceIntepolatable {

typealias Atom = Point
var breaker:DataBreaker<Atom> {
return {
return [self.x, self.y]
}
}
static var joiner:DataJoiner<Atom> {
return {particles in
return Atom(x: particles[0], y: particles[1])
}
}
}

到现在还好。我可以打破Point进入 Array<Double>

let particles = atom.breaker()

但加入

let newAtom = Atom.joiner(particles)

导致编译错误:

Cannot convert value of type 'Atom.Atom' to specified type 'Atom'

可能是因为joiner是静态的。但是如何避免它并获得Atom结果呢?

最佳答案

当你在类的范围之外时,你必须在 Point 上调用它。

let newAtom = Point.joiner(particles)

编辑:

你说你有一个看起来像这样的泛型类:

class Space<Atom: SpaceIntepolatable> {
func test() {
let particles: [Double] = [0, 1]
let newAtom: Atom = Atom.joiner(particles)
}
}

现在,问题是 newAtom 的类型不正确。 SpaceIntepolatable 协议(protocol)没有指定 PointPoint.Atom 是同一类型。因此 Atom (Point) 和 Atom.Atom (Point.Atom) 不被认为是相同的。我们想要的是 Atom.Atom。或者我们可以只让类型被推断:

let newAtom: Atom.Atom = Atom.joiner(particles)

let newAtom = Atom.joiner(particles)

一般来说,建议不要重用类型名称,因为那样你会得到像 Atom.Atom 这样的东西。也许你真的想要这样的东西:

protocol SpaceIntepolatable {
var breaker: DataBreaker<Self> { get }
static var joiner: DataJoiner<Self> { get }
}

并完全失去 Atom 类型别名,然后:

class Space<Atom: SpaceIntepolatable> {
func test() {
let particles: [Double] = [0, 1]
let newAtom: Atom = Atom.joiner(particles)
}
}

将实际工作。

关于swift - 静态 Var 闭包返回 Type.Type 而不是 Type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50456585/

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