符合自定义协议的通用函数 - 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 只有一个协议有效

如何判断一个 Swift 类是继承自另一个类还是符合协议?

来自符合协议的未知类的 Swift init

使 swift 类符合协议 - 在静态/类级别

在符合 UIApperance 的自定义类中允许哪些 Swift 属性类型?

Swift 5:在使用协议实现 Equatable 的结构上实现通用数组操作