如何在 swift 中实现自定义运算符 []

Ant*_*ron 3 custom-operator swift

我用 swift 编写了一个简单的队列类。它是通过数组实现的。现在我希望它的执行更像内置数组。所以我需要实现该[]运算符但失败了。有人帮忙吗?

public class SimpleQueue<T : Any>
{
    private var frontCur = 0
    private var reuseCur = -1
    private var capacity = 0
    private var impl = [T]()

    public var count : Int
    {
        get
        {
            return impl.count - frontCur
        }
    }

    public func empty() -> Bool
    {
        return self.count == 0
    }

    public func size() -> Int
    {
        return impl.count
    }

    public func append(o : T)
    {
        if(frontCur > reuseCur && reuseCur >= 0)
        {
            impl[reuseCur] = o
            reuseCur++
        }
        else
        {
            impl.append(o)
        }
    }

    public func pop()
    {
        frontCur++
    }

    public func front() -> T
    {
        return impl[frontCur]
    }

    public postfix func [](index:Int) -> T //Error!!!!
    {
        return impl[index + frontCur]
    }
}

var x = SimpleQueue<Int>()
for index in 1...10{
    x.append(index)
}
print(x.count)
for index in 1...3{
    x.pop()
}
print(x.count,x.front(),x[2]) // x[2] Error!!!
Run Code Online (Sandbox Code Playgroud)

R M*_*nke 6

苹果文档

\n\n
\n

下标使您能够通过在实例名称后面的方括号中写入一个或\n 多个值来查询某一类型的实例。它们的语法类似于实例方法语法和计算属性语法。您可以使用 subscript 关键字编写下标定义,并指定一个或多个输入参数和返回类型,其方式与实例方法相同。

\n
\n\n
\n\n

下标不是运算符。只是一个标有的方法subscript关键字的方法。

\n\n
subscript (index:Int) -> T {\n    return impl[index + frontCur]\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

读这个:

\n\n
class MyColl {\n\n    private var someColl : [String] = []\n\n    subscript(index: Int) -> String {\n        get {\n            return someColl[index]\n        }\n        set(value) {\n            someColl[index] = value\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

并阅读以下内容:

\n\n
\n

Swift 拥有一套精心设计且广泛的内置集合类型。除了数组、字典和全新的集合类型之外,标准库还提供切片、惰性集合、重复序列等,所有这些都具有一致的操作接口和语法。一组内置的收集协议\xe2\x80\x94SequenceType、CollectionType 和其他几个\xe2\x80\x94 就像梯子上的台阶一样。随着每一步的进步,集合类型在语言和标准库中获得更多功能。

\n
\n

  • ```[]```、```()```、```{}``` 不是运算符。抱歉我的误解。 (2认同)