gpt4 book ai didi

swift - 符合具有通用功能的协议(protocol)的变量

转载 作者:可可西里 更新时间:2023-11-01 00:35:43 26 4
gpt4 key购买 nike

我有一个看起来像这样的协议(protocol):

protocol MyProtocol {
associatedtype SpeedType
var name: String {get set}
func forward(_: SpeedType)
}

我制作了 2 个符合此协议(protocol)的简单类:

class A: MyProtocol {
typealias SpeedType = Double
var name: String

init(name:String) {
self.name = name
}

func forward(_ s: Double) {
print("Moving \(s) km/h")
}
}

class B: MyProtocol {
typealias SpeedType = Int
var name: String

init(name:String) {
self.name = name
}

func forward(_ s: Int) {
print("Moving \(s) km/h")
}
}

我想要实现的是能够声明一个 MyProtocol 类型的变量,然后像这样初始化它:

let x: Bool = true
var person: MyProtocol
if x {
person = A(name: "Robot")
} else {
person = B(name: "Human")
}

在我将 forward() 方法设为“通用”之前,我能够做到这一点,但是现在我遇到了下一个错误:协议(protocol)“MyProtocol”只能用作通用约束,因为它具有 Self 或关联类型要求。

所以我的目标是有一个方法 forward() 可以将我指定的类型的参数作为参数,并且还能够声明符合我的类型的变量协议(protocol)。

最佳答案

Swift 不允许这样做。

原因如下:您对 person.forward(_:) 接受的参数类型一无所知。没有办法调用它。 MyProtocol 本质上定义了一组开放式的独立类型。

如果你不想调用person.forward(_:),你只是想访问非通用的person.name 属性,然后将您的协议(protocol)拆分为定义 name 的基本非通用协议(protocol),以及添加通用 forward(_:) 方法的子协议(protocol)。

protocol NamedThing {
var name: String {get set}
}

protocol MovableNamedThing: NamedThing {
associatedtype SpeedType
func forward(_: SpeedType)
}

class A: MovableNamedThing {
typealias SpeedType = Double
var name: String

init(name:String) {
self.name = name
}

func forward(_ s: Double) {
print("Moving \(s) km/h")
}
}

class B: MovableNamedThing {
typealias SpeedType = Int
var name: String

init(name:String) {
self.name = name
}

func forward(_ s: Int) {
print("Moving \(s) km/h")
}
}

let x: Bool = true
var person: NamedThing
if x {
person = A(name: "Robot")
} else {
person = B(name: "Human")
}

关于swift - 符合具有通用功能的协议(protocol)的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43816356/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com