如何在没有参数的情况下实现 Init()?使用泛型的枚举。无法推断通用参数"T"。迅速



我有一个链表实现。考虑到我使用的是泛型,我想知道是否可以让init((不带参数。目前我有一个错误";未能推断出泛型参数"T";

indirect enum LinkedList<T> {

case Empty
case Node(value: T, next: LinkedList<T>)

init() {
self = .Empty

}
init(value: T) {
self = .Node(value: value, next: .Empty)
}

}

我能做什么

var list = LinkedList<String>.Node(value: "1", next: .Empty)
var list2 = LinkedList(value: 5)

我想做什么

var list = LinkedList()
Swift是一种类型推断语言。因此,编译器需要知道类型是什么,并且对于空的init,没有什么可以推断类型。

因此,您有多种选择来帮助编译器:

// explicitly specify the type of the variable
let list1: LinkedList<Int> = .init()
// or use type casting
let list2 = LinkedList() as LinkedList<Int>

或者,将类型作为参数传递给init。因此,与其创建一个空的init(),不如创建一个具有默认类型值的init,这样在可以推断出它仍然是空的情况下:

init(_ t: T.Type = T.self) {
self = .Empty
}
let list3a = LinkedList(Int.self)
let list3b: LinkedList<Int> = .init() // still works

不相关,但我建议使用camelBase保持Swift约定和名称变量/属性,使用CapitalBase保持类型,所以您的枚举应该是:

indirect enum LinkedList<T> {
case empty
case node(value: T, next: LinkedList<T>)
// ...
}

最新更新