我有这个结构,
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
你知道吗?
答案 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
要好得多。元组只是真正设计为瞬态类型,不能用于长期存储。结构很多更强大,适合长期使用。