遗传算法中的Swift、协议和通用性。

问题描述 投票:0回答:1

我正试图从Java转向Swift,并提高自己在这门语言中的编程能力。

但是,我在学习了Swift中的generics后,对其工作原理有些不理解。

https:/docs.swift.orggswift-bookLanguageGuideGenerics.html。

我已经开始通过写一些协议来写一个遗传算法。

protocol Point : Equatable {
    var identifier: String { get }
    var x: Double { get }
    var y: Double { get }
    func distance<P : Point>(to point: P) -> Double
}

protocol Individual {
    associatedtype P : Point
    var fitness: Double { get }
    var chromosomes: [P] { get }
}

现在我想做一个符合个体协议的结构。

唯一能编译的尝试是

struct Route : Individual {
    typealias P = City;
    var fitness: Double { 0.0 }
    var chromosomes: [City]
}

但是,我想让Route尽可能地通用,因此我不想告诉它使用City作为Point的实现。我想让Route知道它可以在符合Point协议的对象数组上工作。

我希望得到您的帮助。

先谢谢你。

swift generics protocols genetic-algorithm
1个回答
0
投票

首先,我建议在Swift中增加一个 Self 所需 distance(to:) 方法。Self 只是告诉编译器paremeter与符合类型是相同的类型。

protocol Point : Equatable {
    var identifier: String { get }
    var x: Double { get }
    var y: Double { get }
    func distance(to point: Self) -> Double
}

所以,在你的 City 结构 point 也必须是 City.

struct City: Point {
    var identifier: String
    var x: Double
    var y: Double

    func distance(to point: City) -> Double {
        return .zero
    }
}

你可以做你的 Route 添加了一个通用参数,该参数也满足了由 Individual 协议。

struct Route<P: Point>: Individual {
    var fitness: Double { 0.0 }
    var chromosomes: [P]
}

要实例化一个 Route:

var cityRoute = Route<City>(chromosomes: [])

0
投票

你可以创建一个实现特定协议的类的数组,例如在这种情况下,你将有。

 struct Route: Individual {
    typealias P = City;
    var fitness: Double { 0.0 }
    var chromosomes: [Point]
}

你可以调用所有的协议方法。

© www.soinside.com 2019 - 2024. All rights reserved.