Вам нужно позвонить на 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
не указывает, что Point
и Point.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
typealias, тогда:
class Space<Atom: SpaceIntepolatable> {
func test() {
let particles: [Double] = [0, 1]
let newAtom: Atom = Atom.joiner(particles)
}
}
действительно будет работать.