符合自定义协议的通用函数 - Swift
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了符合自定义协议的通用函数 - Swift相关的知识,希望对你有一定的参考价值。
我想创建一个函数,它接受所需的返回类型作为参数,并且应该符合我的自定义协议。
以下是我在游乐场的代码。
protocol InitFunctionsAvailable {
func custom(with: Array<Int>)
}
class model1: InitFunctionsAvailable {
var array: Array<Int>!
func custom(with: Array<Int>) {
array = with
}
}
func call<T: InitFunctionsAvailable>(someObject: T) -> T {
return someObject.custom(with: []) as! T
}
let model = call(someObject: model1())
print(model.array)
我得到错误
无法将类型'()'(0x1167e36b0)的值转换为'__lldb_expr_76.model1'(0x116262430)。
我需要的是函数应该根据参数返回模型。
答案
问题出在这里:
return someObject.custom(with: []) as! T
someObject.custom(with: [])
没有返回值,因此它“返回”Void
(或()
,如果你想),但你试图把它投射到T
,在你的例子中是model1
实例。你不能把Void
施加到model1
。
您可以在您的情况下通过更改call
方法来修复它:
func call<T: InitFunctionsAvailable>(someObject: T) -> T {
return someObject.custom(with: []) as! T
}
至:
func call<T: InitFunctionsAvailable>(someObject: T) -> T {
// perform action on it
someObject.custom(with: [])
// and then return it
return someObject
}
另一答案
这也完成了这项工作。
import Foundation
protocol InitFunctionsAvailable
{
func custom(with: Array<Int>) -> InitFunctionsAvailable
}
class model1: InitFunctionsAvailable
{
var array: Array<Int>!
func custom(with: Array<Int>) -> InitFunctionsAvailable
{
array = with
return self
}
}
func call<T: InitFunctionsAvailable>(someObject: T) -> T
{
return someObject.custom(with: []) as! T
}
let model = call(someObject: model1())
print(model.array)
以上是关于符合自定义协议的通用函数 - Swift的主要内容,如果未能解决你的问题,请参考以下文章
Swift-自定义 UITableViewCell 委托给 UIViewController 只有一个协议有效