在 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
{
}
我的想法是:
- lhs 显然是我从数组中取出的对象,我想对其执行调用
- rhs 是我想调用的方法。在这种情况下
method()
不会不带参数,return 和 Int
,因此
- return 值为整数。
但是,出现以下问题/不确定性:
- 这是正确的方法吗?
- 我的上述假设是否正确?
- 如何在提取的
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()
}
我实现了一个助手来拥有一个无主引用数组:
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
{
}
我的想法是:
- lhs 显然是我从数组中取出的对象,我想对其执行调用
- rhs 是我想调用的方法。在这种情况下
method()
不会不带参数,return 和Int
,因此 - return 值为整数。
但是,出现以下问题/不确定性:
- 这是正确的方法吗?
- 我的上述假设是否正确?
- 如何在提取的
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()
}