我正在java课程中学习数据结构,为了好玩和学习,我试图在Swift中编写这些东西。我正在尝试实现协议,但我在设置方法存根时遇到问题。我尝试返回nil,但是没有用,但现在我收到了这个错误:
“Swift编译器错误'E'不能转换为'E'”
这很奇怪。这是基于通用数组的列表的代码。这就是我到目前为止所做的:
struct ArrayLinearList<E>: LinearListADT {
let DEFAULT_MAX_SIZE = 100;
var currentSize: Int
var maxSize: Int
var storage = [E]()
init(sizeOfList: Int) {
currentSize = 0
maxSize = sizeOfList
storage = [E]()
}
mutating func addFirst<E>(obj: E) {
}
mutating func addLast<E>(obj: E) {
}
mutating func insert<E>(obj: E, location: Int) {
}
mutating func remove<E>(location: Int) -> E {
return storage[location] //***This is where I get the above error
}
mutating func remove<E>(obj: E) -> E {
return nil //I tried this but that didn't work either
}
mutating func removeFirst<E>() -> E? {
return nil //I also tried this but that didn't work
}
mutating func removeLast<E>() -> E? {
return nil
}
mutating func get<E>(location: Int) -> E? {
return nil
}
mutating func contains<E>(obj: E) -> Bool {
return false
}
mutating func locate<E>(obj: E) -> Int? {
return nil
}
mutating func clear<E>() {
}
mutating func isEmpty<E>() -> Bool {
}
mutating func size<E>() -> Int {
}
}
编辑:我刚发现错误。使用Jesper的建议我发现我没有在Swift中正确编写协议。看看这个答案“
how to create generic protocols in swift iOS?
我现在能够让它运转起来。谢谢Jesper!
答案 0 :(得分:1)
您不应该在这些方法上使用类型参数E
- 它将被视为与结构上的类型参数不同的类型参数。删除这些方法定义中的<E>
,将使用结构本身中的那个。
此外,您可能必须向E
添加约束,以确保它实现NilLiteralConvertible
(如可选),否则您无法返回nil
一个应该返回E
的函数。
答案 1 :(得分:0)
我刚发现错误。使用Jesper的建议我发现我没有在Swift中正确编写协议。看看这个答案“
How to create generic protocols in Swift?
我现在能够让它运转起来。谢谢Jesper!