2017-03-22 20 views
2

我有这样的结构,在Swift中更好的“无功能”?

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

(所以,第一行的“给你一个值”,第二个“改变的东西”,最后两个只是限制。)

所以,你可能有这样的事情数组...

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 

我的问题......

通知的第一个数组中,我只是想我吨至是一个Tweak

的“一无所有”版本,所以,我这样做

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

在斯威夫特有没有更好的方式来做到这两个“没有”倒闭潮,或者实际上,一个更正确的完成整个事情的方法?

nothingTweak: Tweak = lessNilThanNil 

你知道吗?

回答

1

没有内置值表示“返回0 CGFloat值的闭包”,更不用说它们的元组以及其他两个零值。

但是如果创建一个类型,诸如struct,以表示Tweak(而不是使用一个元组的typealias),可以定义static常数(一个或多个)来表示Tweak的“默认”值。例如:

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 
} 

现在只要一Tweak的预期,你就可以说.zero指你的“零违约”(这是什么类型,如CGPoint做):

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

创建结构在这种情况下比创建元组的typealias好得多。元组只是真的被设计为瞬态类型,不能用于长期存储。结构多为更强大,适合长期使用。

+0

精彩!!!!!!!!!!!!!!!!!! – Fattie

+0

*随时可以将我重命名为更合适的东西*因为某种原因给了我一个不错的笑声! – Fattie

+0

乐意帮忙@JoeBlow :) – Hamish