首页 > 解决方案 > 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 协议的对象数组。

我会很感激你的帮助。

先感谢您。

标签: swiftgenericsprotocolsgenetic-algorithm

解决方案


首先,我建议在方法上添加一个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: [])

推荐阅读