Swift是一种类型推断语言。因此,编译器需要知道类型是什么,并且对于空的
我有一个链表实现。考虑到我使用的是泛型,我想知道是否可以让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()
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>)
// ...
}