在Swift中编写自定义访问运算符

时间:2015-01-15 06:34:01

标签: swift operators

我实现了一个帮助程序,以获得一组无主引用:

class Unowned<T: AnyObject>
{        
    unowned var value : T    

    init (value: T) { self.value = value }
    func get() -> T { return self.value }
}

现在,可以[ Unowned<Foo> ]。但是,我不满意使用额外的get()方法来检索底层对象。所以,我想编写一个自定义二元运算符,例如-->能够做到

for unownedFoo in ArrayOfUnownedFoos
{
    var bar : Int = unownedFoo-->method()
}

我目前的方法是定义

infix operator --> { }
func --><T> (inout lhs: Unowned<T>, inout rhs: () -> Int) -> Int
{
}

我背后的想法是:

  1. lhs显然是我从数组中获取的对象,我想在其上执行调用
  2. rhs是我想要打电话的方法。在这种情况下,method()不会使用任何参数并返回Int,因此
  3. 返回值为int。
  4. 然而,出现以下问题/不确定因素:

    1. 这是正确的方法吗?
    2. 我的假设是否正确?
    3. 如何在提取的rhs的实例上调用提供的闭包Unowned<T>,例如(伪代码)lhs.value.rhs()。如果method()是静态的,我可以T.method(lhs.value),但是我必须以某种方式提取方法的名称以使其更通用。

2 个答案:

答案 0 :(得分:1)

使用类似:

func --> <T:AnyObject, V> (lhs: Unowned<T>, rhs: (T) -> V) -> V
{
   return rhs (lhs.get())
}

然后将其用作:

for unownedFoo in ArrayOfUnownedFoos
{
    var bar : Int = unownedFoo-->{ (val:Int) in return 2*val }
}

具体来说,你不想使用method(),因为它本身就是一个函数调用 - 除非method()实际上返回一个闭包,否则你可能不需要它。

答案 1 :(得分:1)

也许,后缀运算符相当简单。

postfix operator * {}

postfix func *<T>(v:Unowned<T>) -> T {
    return v.value
}

// Usage:
for unownedFoo in ArrayOfUnownedFoos {
    var bar : Int = unownedFoo*.method()
}