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

Write a custom access operator in Swift

我实现了一个助手来拥有一个无主引用数组:

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() 不会不带参数,return 和 Int,因此
  3. return 值为整数。

但是,出现以下问题/不确定性:

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

使用类似于:

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() 实际上返回一个闭包。

也许,后缀运算符很简单。

postfix operator * {}

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

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