gpt4 book ai didi

swift - Swift 中使用的 ~>(波浪号大于)运算符是什么?

转载 作者:IT王子 更新时间:2023-10-29 05:27:00 24 4
gpt4 key购买 nike

Swift 1.1 包含 ~> 运算符的声明:

infix operator ~> {
associativity left
precedence 255
}

这在 Swift 中有什么用?它似乎已声明,但没有定义利用它的函数。其他开发人员已将它用于响应模式和队列之间的编码(marshal)处理闭包,但我想知道为什么它在标准框架中定义。我推测它是为了“保留”一个自定义运算符供开发人员使用,因为它具有尽可能高的优先级。

最佳答案

由于 Swift 已经开源,我们可以看到包含 ~> 的真正原因。在标准库中:as a workaround for method specialization in a child protocol in Swift 1.x .

// Workaround for <rdar://problem/14011860> SubTLF: Default
// implementations in protocols. Library authors should ensure
// that this operator never needs to be seen by end-users. See
// test/Prototypes/GenericDispatch.swift for a fully documented
// example of how this operator is used, and how its use can be hidden
// from users.
infix operator ~> { associativity left precedence 255 }

可以在 test/Prototypes/GenericDispatch.swift 中找到详细示例.

注意:不要使用~>在 Swift 2+ 中。这是一个历史解决方法。它不再需要。继续阅读。


如何~>作品

在 Swift 2 中,唯一剩下的 ~> 实例是 abs功能(也可能会消失)。我们可以看到实际上~>作品。来自 stdlib/public/core/IntegerArithmetic.swift.gyb , SignedInteger协议(protocol)定义了一个 ~>运算符(operator):

struct _Abs {}

protocol SignedNumber: Comparable {
prefix func -(_: Self) -> Self

func ~> (_: Self, _: (_Abs, ()) -> Self
}

func ~> <T: SignedNumber>(x: T, _: (_Abs, ()) -> T {
return x < 0 ? -x : x
}

在这里,箭头的 RHS ~>指定可以向对象发送什么命令。想到p~>(cmd, args)就像 p.cmd(args) .

然后我们提供 _Abs默认实现当给出 SignedNumber .

protocol AbsoluteValuable : SignedNumber {
static func abs(_: Self) -> Self
}

func ~> <T: AbsoluteValuable>(x: T, _: (_Abs, ())) -> T {
return T.abs(x)
}

接下来,我们有一个子协议(protocol),AbsoluteValuable ,这可能比 x < 0 ? -x : x 更有效地计算绝对值.然后我们专门研究 ~> AbsoluteValuable 的运算符.

func abs<T: SignedNumber>(_ x: T) -> T {
return x ~> (_Abs(), ())
}

最后我们隐藏~>调用公共(public)包装器方法。如果T实际上是一个 AbsoluteValuable ,越专业,效率越高~>将被选中。

这也是我们得到 42 ~> _advance(12) 的原因或 42 ~> _distanceTo(23)如图@rintaro's answer ,因为 .advanceBy.distanceTo一般 ForwardIndexType 的方法是 O(n) ,但如果类型为 RandomAccessIndexType,则可以在 O(1) 中实现.


你不需要~>

这种模式也可以在调用 ~> 的情况下完成。运算符,使用协议(protocol)扩展:

protocol SignedInteger: Comparable {
prefix func -(_: Self) -> Self

func genericAbs() -> Self
}

extension SignedInteger {
func genericAbs() -> Self {
return self < 0 ? -self : self
}
}

protocol AbsoluteValueable: SignedInteger {
static func abs(_: Self) -> Self
}

extension AbsoluteValueable {
func genericAbs() -> Self {
return Self.abs(self)
}
// normally you would allow subtypes to override
// genericAbs() directly, instead of overriding
// static abs().
}

func abs<T: SignedInteger>(x: T) -> T {
return x.genericAbs()
}

特别是这就是为什么所有其他 ~>abs 之外的实现在 Swift 2 中消失了:所有使用此技术的特化都已更改为使用更明显的协议(protocol)扩展,例如


注意:雷达问题 14011860 并未公开,但我们可以通过其在 OpenRadar 上的副本看到该错误的范围:

关于swift - Swift 中使用的 ~>(波浪号大于)运算符是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26758297/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com