我实现了一个帮助程序,以获得一组无主引用:
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
{
}
我背后的想法是:
method()
不会使用任何参数并返回Int
,因此然而,出现以下问题/不确定因素:
rhs
的实例上调用提供的闭包Unowned<T>
,例如(伪代码)lhs.value.rhs()
。如果method()
是静态的,我可以T.method(lhs.value)
,但是我必须以某种方式提取方法的名称以使其更通用。答案 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()
}