【问题标题】:Swift, Protocols and Generics in Genetic AlgorithmSwift,遗传算法中的协议和泛型
【发布时间】:2020-05-03 06:25:44
【问题描述】:

我正在尝试从 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 }
}

现在我想创建一个符合 Individual 协议的结构。

编译的唯一尝试是

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】:

    首先,我建议在distance(to:) 方法上添加Self 要求。 Self 只是告诉编译器参数是与符合类型相同的类型。

    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: [])
    

    【讨论】:

    • 太棒了。它按我的意愿工作。谢谢你。我不知道我可以使用 Self 作为类型。
    【解决方案2】:

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

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

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

    【讨论】:

    • var chromosomes: [Point] 编译器说:“协议‘点’只能用作通用约束,因为它有 Self 或相关类型的要求”。我以前也想过这样的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多