What is the ~> (tilde greater than) operator used for in Swift? -
swift 1.1 includes declaration of ~> operator:
infix operator ~> { associativity left precedence 255 } what used in swift? appears declared no functions defined leverage it. other developers have used reactive patterns , marshaling closures between queues, wondering why it's defined in standard framework. surmise it's there "reserve" custom operator developer use, given has highest precedence possible.
since swift has been open-sourced can see actual reason including ~> in stdlib: as workaround method specialization in child protocol in swift 1.x.
// workaround <rdar://problem/14011860> subtlf: default // implementations in protocols. library authors should ensure // operator never needs seen end-users. see // test/prototypes/genericdispatch.swift documented // example of how operator used, , how use can hidden // users. infix operator ~> { associativity left precedence 255 } a detailed example can found in test/prototypes/genericdispatch.swift.
note: do not use ~> in swift 2+. historical workaround. no longer needed. read on.
how ~> works
in swift 2, remaining instance of ~> abs function (which going away well). can see how ~> works. stdlib/public/core/integerarithmetic.swift.gyb, signedinteger protocol defines ~> 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 } here, rhs of arrow ~> specifies command can sent object. think of p~>(cmd, args) p.cmd(args).
then provide default implementation of _abs when given signednumber.
protocol absolutevaluable : signednumber { static func abs(_: self) -> self } func ~> <t: absolutevaluable>(x: t, _: (_abs, ())) -> t { return t.abs(x) } next, have child protocol, absolutevaluable, perhaps has more efficient way compute absolute value x < 0 ? -x : x. specialize ~> operator absolutevaluable.
func abs<t: signednumber>(_ x: t) -> t { return x ~> (_abs(), ()) } finally hide ~> call in public wrapper method. if t absolutevaluable, more specialized , more efficient ~> chosen.
this why 42 ~> _advance(12) or 42 ~> _distanceto(23) shown in @rintaro's answer, because .advanceby , .distanceto methods o(n) general forwardindextype, can implemented in o(1) if type randomaccessindextype.
you don't need ~>
this pattern done without invoking ~> operator, using extensions on 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) } // allow subtypes override // genericabs() directly, instead of overriding // static abs(). } func abs<t: signedinteger>(x: t) -> t { return x.genericabs() } in particular why other ~> implementations besides abs gone in swift 2: specializations using technique has been changed use protocol extensions more obvious, e.g.
underestimatecountin commit c48d6aa0 (2015 apr 16)advancedby,distancetoin commit 311baf73 (2015 aug 4)- etc.
note: radar problem 14011860 not public, may see scope of bug duplicates on openradar:
Comments
Post a Comment