Swift “更好”;“无功能”;斯威夫特?

Swift “更好”;“无功能”;斯威夫特?,swift,closures,Swift,Closures,我有这个结构, typealias Tweak = ( grab:(_ p: SomeClass)->CGFloat, change:(_ p: SomeClass, _ n: CGFloat)->(), from:CGFloat, upto:CGFloat ) (因此,第一行“给你一个值”,第二行“改变一些东西”,最后两行只是限制。) 所以,你可能有一系列这样的东西 var tweaks:[Tweak] = [ ({_ in 0}, {_ in},

我有这个结构,

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
我的问题

注意数组中的第一个,我只是希望它是
调整的“无”版本

所以,我做了这个

nothingTweak: Tweak = ({_ in 0}, {_ in}, 0,0)
在Swift中,有没有更好的方法来完成两个“无”闭包,或者更正确的方法来完成整个过程

nothingTweak: Tweak = lessNilThanNil

你知道吗?

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

但是,如果您创建一个类型(例如
结构
)来表示
调整
(而不是使用元组的
类型别名
),则可以定义
静态
常量来表示
调整
的“默认”值。例如:

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
这样的类型所做的):


在本例中,创建结构比创建元组的
typealias
更可取。元组实际上只是被设计成瞬态类型,而不是用于长期存储。结构更强大,更适合长期使用。

请随意将我重命名为更合适的名称,因为某些原因,它会让我发出好笑的笑声!很乐意帮助@JoeBlow:)
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
    )
]