gpt4 book ai didi

ios - 在 Swift 中使用泛型协议(protocol)实现委托(delegate)

转载 作者:搜寻专家 更新时间:2023-10-31 23:05:15 25 4
gpt4 key购买 nike

我正在尝试创建一个委托(delegate)协议(protocol)来实现一个函数,该函数传递一个泛型类型的数组。我尝试了几种组合,但似乎没有一种能奏效。

这是我所达到的最近似的结果。这是协议(protocol):

     protocol APIControllerProtocol {

typealias T

func didReceiveAPIResults(results: [T])
}

这是委托(delegate)人对象:

    class APIController<U:APIControllerProtocol> {

typealias ElementType = U
var delegate: ElementType?

init(delegate: ElementType){

self.delegate = delegate

}

func getAPIResults(){

// Perform some action before delegation
// "results" is an Array of dictionaries got from NSJSONSerialization

self.delegate?.didReceiveAPIResults(results.map{dict in Album(json:dict)})

}

}

但是,最后一行出现此错误:“Album is not conversionble to U.T”

“相册”是用于返回结果的模型对象。

我做错了什么?

编辑:

正在关注 Mike S advice ,我已经使协议(protocol)方法 didReceiveAPIResults 成为一个通用函数,并在委托(delegate)中指定了 T 是什么。但是,当接收类型 T 的参数并将其分配给委托(delegate)中的属性时,出现错误:“T 与 T 不相同”

class TestDelegate: APIControllerProtocol {
typealias T = Album
var albums:[T] = [T]()

func didReceiveAPIResults<T>(results: [T]) {
// ...

self.albums = results //ERROR: "T is not identical to T"
}
}

最佳答案

你的 didReceiveAPIResults申报 APIControllerProtocol需要是一个泛型函数,这样泛型类型 T正确传递给它。

protocol APIControllerProtocol {
typealias T

func didReceiveAPIResults<T>(results: [T])
}

注意:这意味着您的委托(delegate)定义需要定义 T 是什么是:

class TestDelegate: APIControllerProtocol {
typealias T = Album

func didReceiveAPIResults<T>(results: [T]) {
// ...
}
}

更新:虽然上面的代码确实消除了原始错误,但事实证明它更像是一种变通方法,并没有真正解决问题的根源。

真正的问题似乎是编译器无法协调 U.T 的内容是没有歧义的。这实际上很容易修复,我们只需要给它一个更精确的定义(注意 where 定义中的 APIController 子句):

protocol APIControllerProtocol {
typealias T
func didReceiveAPIResults(results: [T])
}

class APIController<U:APIControllerProtocol where U.T == Album> {
typealias ElementType = U
// ...
}

注意:我删除了 <T>我之前添加到协议(protocol)中的功能;不再需要了,以后会导致问题。

由此,TestDelegate类按预期工作(您甚至不再需要 typealias):

class TestDelegate: APIControllerProtocol {
var albums: [Album]? = nil

func didReceiveAPIResults(results: [Album]) {
albums = results
}
}

关于ios - 在 Swift 中使用泛型协议(protocol)实现委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25732775/

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