2017-03-22 1 views
2

Ich habe diese Struktur,Bessere "Nichtsfunktion" in Swift?

typealias Tweak = (
    grab:(_ p: SomeClass)->CGFloat, 
    change:(_ p: SomeClass, _ n: CGFloat)->(), 
    from:CGFloat, upto:CGFloat 
) 

(also die erste Zeile „gibt Ihnen einen Wert“, der zweite „ändert sich etwas“, sind die letzten beiden nur Grenzen.)

So

, können Sie eine Reihe von solchen Dingen haben ...

var tweaks:[Tweak] = [ 
    ({_ in 0}, {_ in}, 0,0), 

    ( {p in mainHeight}, 
     {p, n in 
      mainHeight = n 
      paintDisplayWhatever()}, 
     8.0, 28.0), 

    ( {p in Some.global}, 
     {p, n in 
      Some.global = n 
      fireball.adjust(heat: n)}, 
     8.0, 28.0), 

    etc 

Meine Frage ...

Bekanntmachung der erste in der Reihe, ich wollte einfach i t zu sein, die „nichts“ Version eines Tweak

Also, ich habe diese

nothingTweak: Tweak = ({_ in 0}, {_ in}, 0,0) 

In Swift gibt es einen besseren Weg, um die beiden „nichts“ Schließungen zu tun, oder in der Tat, eine korrektere Weg, um das Ganze zu machen?

nothingTweak: Tweak = lessNilThanNil 

Sie wissen?

Antwort

1

Es gibt keinen eingebauten Wert, der "eine Schließung darstellt, die einen 0 CGFloat Wert zurückgibt", geschweige denn ein Tupel von ihnen zusammen mit zwei anderen Nullwerten.

jedoch wenn Sie eine Art, wie ein struct, erstellen Sie eine Tweak darzustellen (anstatt eine typealias eines Tupels verwenden), können Sie static Konstante (n) definieren, um "default" Werte von a Tweak . Zum Beispiel:

class SomeClass {} 

struct Tweak { 

    // feel free to rename me to something more appropriate 
    static let zero = Tweak(grab: {_ in 0 }, change: {_ in }, from: 0, upto: 0) 

    var grab: (_ p: SomeClass) -> CGFloat 
    var change: (_ p: SomeClass, _ n: CGFloat) -> Void 
    var from: CGFloat 
    var upto: CGFloat 
} 

Jetzt, wo immer ein Tweak zu erwarten ist, können Sie einfach .zero sagen zu Ihrem „Null default“ beziehen (dies ist genau das, was Typen wie CGPoint tun):

var tweaks: [Tweak] = [ 

    .zero, 

    Tweak(
     grab: { p in 25 }, 
     change: { p, n in 
      print(p, n) 
     }, 
     from: 8, upto: 28 
    ), 

    Tweak(
     grab: { p in 27 }, 
     change: { p, n in 
      print(p, n * 4) 
     }, 
     from: 8, upto: 28 
    ) 
] 

anlegen Struktur ist viel besser als in diesem Fall ein typealias eines Tupels zu erstellen. Tupel sind nur wirklich als transiente Typen gedacht, die nicht für die Langzeitspeicherung verwendet werden. Strukturen sind viel leistungsfähiger und für den langfristigen Einsatz geeignet.

+0

brilliant !!!!!!!!!!!!!!!!!! – Fattie

+0

* Fühlen Sie sich frei, mich zu etwas passenderes umzubenennen * das gab mir ein gutes Lachen aus irgendeinem Grund! – Fattie

+0

Glücklich, @JoeBlow zu helfen :) – Hamish

Verwandte Themen