我正试图从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中增加一个 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: [])
你可以创建一个实现特定协议的类的数组,例如在这种情况下,你将有。
struct Route: Individual {
typealias P = City;
var fitness: Double { 0.0 }
var chromosomes: [Point]
}
你可以调用所有的协议方法。