繁体   English   中英

默认参数为通用类型

[英]Default parameter as generic type

我有用Swift编写的协议及其实现:

protocol P {
}

struct A: P {
}

协议用作某些功能的通用类型:

func foo<T: P>(param: T) {
}

func foo() {
    foo(param: A())
}

到目前为止,一切正常。 但是我想将A()设置为给定函数的默认参数:

func foo<T: P>(param: T = A()) {
}

不幸的是,出现以下错误:

类型“ A”的默认参数值不能转换为类型“ T”。

要么

func foo<T: P>(param: T = A() as P) {
}

let a: P = A()
func foo<T: P>(param: T = a) {
}

返回:

类型'P'的默认参数值不能转换为类型'T'

要么

func foo<T: P>(param: T = A() as T) {
}

返回:

“ A”不可转换为“ T”; 您是要使用“ as!”吗? 强迫垂头丧气?

我做错了什么? 问题出在哪儿?

我不想像这样使用强制施法:

func foo<T: P>(param: T = A() as! T) {
}

先感谢您。

您正在尝试在泛型函数中强制使用非泛型默认参数:您可能应该考虑在这里要实现的目标。

为了便于讨论,您可以在函数签名中包括尝试将A()强制转换为T ,但是您需要将参数类型更改为optional以允许转换失败( nil ),例如

func foo<T: P>(param: T? = (A() as? T)) { }

一个更合理的选择是-除了泛型函数外,还针对TA实例提供一个具体的非泛型函数(具体函数将优先于泛型函数),在这种情况下,您可以包括A()的默认参数在具体功能的功能签名中。 例如

protocol P { }
struct A: P { }
extension Int: P { }

func foo<T: P>(param: T) { print("called generic foo") }
func foo(param: A = A()) { print("called A specific foo") }

foo()    // called A specific foo (making use of default arg)
foo(A()) // called A specific foo
foo(1)   // called generic foo

需要注意的是,非通用foo被称为即使A符合PA 可能已经利用了通用的foo ):这里有没有冲突的具体功能优先。


另一方面,如果您只希望泛型函数允许在不使用单个参数的情况下进行调用(即使用默认参数),则可以在P包含一个简单的初始化程序的蓝图,从而可以初始化的实例。通用类型作为默认参数; 参见@Sulthan:s的答案

您唯一需要做的就是向协议添加一个初始化器的要求:

protocol P {
    init()
}

struct A: P {
    var x: Int

    init() {
        x = 10
    }
}

func foo<T: P>(param param: T = T()) {
}

但是,您将遇到另一个问题。 传递的参数的类型决定了泛型的类型,因此您将不得不以其他方式指定泛型类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM