[英]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)) { }
一个更合理的选择是-除了泛型函数外,还针对T
为A
实例提供一个具体的非泛型函数(具体函数将优先于泛型函数),在这种情况下,您可以包括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
符合P
( A
可能已经利用了通用的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.