Swift中更好的“无功能”?

时间:2017-03-22 14:12:42

标签: swift closures

我有这个结构,

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)

在Swift中有更好的方法来做两个“无关”的闭包,或者更确切地说,一个更正确的方法来完成整个事情吗?

nothingTweak: Tweak = lessNilThanNil
你知道吗?

1 个答案:

答案 0 :(得分: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要好得多。元组只是真正设计为瞬态类型,不能用于长期存储。结构很多更强大,适合长期使用。