当前位置: 首页 > 面试题库 >

在Swift中,〜>(大于等于)运算符是什么?

计承德
2023-03-14
问题内容

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

infix operator ~> {
    associativity left
    precedence 255
}

这在Swift中有什么用?它似乎已声明,但未定义任何可利用它的函数。其他开发人员已将其用于响应模式和封送队列之间的封包,但我想知道为什么在标准框架中对其进行了定义。我猜想它可以“保留”一个自定义运算符供开发人员使用,因为它具有最高的优先级。


问题答案:

由于Swift是开源的,我们可以看到将~>stdlib 包括在内的实际原因:作为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 /公共/核心/
IntegerArithmetic.swift.gyb
,该SignedInteger协议定义了一个~>运算符:

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)
}

接下来,我们有一个子协议,该子协议AbsoluteValuable可能比拥有更有效的方法来计算绝对值x < 0 ? -x : x。然后,我们专门~>针对AbsoluteValuable

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

最后,我们将~>调用隐藏在公共包装方法中。如果T实际为AbsoluteValuable,则将选择更专业的方式,因此效率更高~>

这也是为什么我们得到@rintaro42 ~>
_distanceTo(23)如@rintaro的答案所示[的原因,因为.advanceByand.distanceTo方法对于一般而言是O(n)ForwardIndexType,但是如果类型为,则可以在O(1)中实现RandomAccessIndexType`。

你不需要 ~>

使用协议扩展,也可以在 调用~>操作员的 情况下 完成此模式:

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()
}

特别是这就是为什么Swift 2中所有其他~>实现abs都消失的原因:使用此技术的所有专业都已更改为使用协议扩展,例如协议扩展。

  • underestimateCount在提交c48d6aa0(2015 4月16日)
  • advancedBydistanceTo在提交311baf73(2015 8月4日)
  • 等等

注意:雷达问题14011860不是公开的,但是我们可以通过在OpenRadar上重复查找此错误的范围:

  • #17298843“ Swift:支持协议默认方法和协议扩展(= mixins)
  • #17412469“ Swift- 允许将带有实现的功能添加到协议中


 类似资料:
  • 问题内容: 在Swift 3中,如果我使用或,这是一个编译错误 编译错误: 可选类型’Int?’的值 没有包装; 你是说用’!’ 要么 ‘?’? 但如果我与或比较 问题答案: 对于相等运算符来说,支持可选值是很有意义的,因为对于任何整数值变量,这是绝对清楚的: 当且仅当它们的值相同时 另一方面,尚不清楚与的比较应如何起作用: 是小于? 如果我想对数组进行排序以使所有s都在末尾出现,那么我希望小于。

  • 问题内容: 我注意到我可以使用运算符比较所有本机数据类型(整数,字符串,布尔值,浮点数等),还可以比较包含本机数据类型的列表,元组,集合和字典。在这些情况下,操作员将检查两个对象是否相等。但是在某些其他情况下(试图比较我创建的类的实例),该运算符只是检查两个变量是否引用同一对象(因此在这些情况下,该运算符等效于该运算符) 我的问题是:什么时候操作员不只是比较身份? 编辑:我正在使用Python 3

  • 问题内容: 我已经用谷歌搜索,但无法找出什么是等效的。 这是我唯一能找到的(Swift的替代方法responsesToSelector:),但在我的情况下并没有太大意义,因为它检查了委托的存在,我没有委托,我只想检查是否存在新的API在设备上运行时是否返回,如果不是,则返回原先的api版本。 问题答案: 如前所述,在 大多数情况下,您可以使用可选的unwrapper运算符来实现所需的功能。这样,当

  • 问题内容: 有人可以解释一下SQL中的以下行为吗? 问题答案: 是标准SQL-92;是等效的。两者都评估值,但不是-是占位符,表示不存在值。 这就是为什么您只能在此类情况下使用/作为谓词的原因。 此行为不特定于SQL Server。所有符合标准的SQL方言都以相同的方式工作。 注意 :要比较如果您的 值不为null ,请使用,而要与 不为null 值进行比较,请使用。我不能说我的值是否等于NULL

  • 问题内容: 我来自ac风格语言,因此我很自然地使用不相等的语言,但是当我使用Python时,从我阅读的文档中我了解到为此目的使用了运算符。 最近,我看到了很多使用的代码,所以我的问题是,其中之一比其他的更受青睐,还是其中之一被弃用了。 另外,我想知道它们之间是否有任何区别。 问题答案: 蟒2只支持 两个 ,在Python 3的操作者已被删除。 两者之间没有区别,但是是首选形式。

  • 问题内容: 有两个不等于运算符-和。 它们之间有什么区别?我听说这比其他字符串比较有效。任何人都可以对此声明做出定性评论。 问题答案: 它们是相同的(与第三种形式一样)。 不过请注意,从解析器的角度来看,它们仍然被认为是不同的,这是为将不匹配或定义的存储轮廓。 这不像在解析器对待和还在分析阶段,所以你不能超载,并为不同的运营商。