swift - Swift,遗传算法中的协议和泛型
问题描述
我正在尝试从 Java 切换到 Swift 并提高我使用这种语言的编程技能。
但是,在研究了以下内容后,我很难理解泛型在 Swift 中的工作原理:
https://docs.swift.org/swift-book/LanguageGuide/Generics.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 协议的对象数组。
我会很感激你的帮助。
先感谢您。
解决方案
首先,我建议在方法上添加一个Self
要求。只是告诉编译器参数与符合类型相同。distance(to:)
Self
protocol Point : Equatable {
var identifier: String { get }
var x: Double { get }
var y: Double { get }
func distance(to point: Self) -> Double
}
所以,在你的City
结构中point
也必须是 type 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: [])
推荐阅读
- vuetify.js - 使用 VueCLI 3 编译手写笔
- python-3.x - 使用 spacy 生成文本特征会消耗太多时间
- php - 如何滚动到硒中的特定元素?
- java - 为什么我的可运行接口循环我的队列在这里继续
- android - dx.jar “忽略匿名内部类的 InnerClasses 属性”
- laravel - Laravel 和 Vue 身份验证表单在登录失败时重新加载
- javascript - 通过选项卡选择单选按钮
- php - 制作delete.php文件,代码给我错误
- android - 如何在不丢失阴影和弯曲边缘的情况下更改默认按钮的背景颜色?
- excel - 每次打开或编辑 Excel 上的任何内容时,如何启用此宏?