在方法存根中返回nil或类似的东西

时间:2015-03-20 13:21:11

标签: swift generics

我正在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!

2 个答案:

答案 0 :(得分:1)

您不应该在这些方法上使用类型参数E - 它将被视为与结构上的类型参数不同的类型参数。删除这些方法定义中的<E>,将使用结构本身中的那个。

此外,您可能必须向E添加约束,以确保它实现NilLiteralConvertible(如可选),否则您无法返回nil一个应该返回E的函数。

答案 1 :(得分:0)

我刚发现错误。使用Jesper的建议我发现我没有在Swift中正确编写协议。看看这个答案“

How to create generic protocols in Swift?

我现在能够让它运转起来。谢谢Jesper!