【发布时间】:2019-01-29 11:35:10
【问题描述】:
==> swift 3 版本完美运行,但 swift 4 和 swift 4.2 正在运行。
static func animate(_ duration: TimeInterval,
animations: (() -> Void)!,
delay: TimeInterval = 0,
options: UIViewAnimationOptions = [],
withComplection completion: (() -> Void)! = {}) {
UIView.animate(
withDuration: duration,
delay: delay,
options: options,
animations: {
animations()
}, completion: { finished in
completion()
})
}
static func animateWithRepeatition(_ duration: TimeInterval,
animations: (() -> Void)!,
delay: TimeInterval = 0,
options: UIViewAnimationOptions = [],
withComplection completion: (() -> Void)! = {}) {
var optionsWithRepeatition = options
optionsWithRepeatition.insert([.autoreverse, .repeat])
self.animate(
duration,
animations: {
animations()
},
delay: delay,
options: optionsWithRepeatition,
withComplection: { finished in
completion()
})
}
xcode 上的错误显示 =>
无法将 '(_) -> Void' 类型的值转换为预期的参数类型 '(() -> 无效)?'
【问题讨论】:
-
哪一行?删除该行中的`finished in`,因为
withComplection没有参数,所以没有“finished”。 -
离题,但有人可以解释一下!表示在参数声明中
animations: (() -> Void)! -
@JoakimDanielson 查找隐式展开的选项
-
@DávidPásztor 谢谢,我理解了这个概念,例如在将它用于
@IBOutlet时,但我真的不明白在参数声明中包含它们意味着什么。 -
@JoakimDanielson 隐式解包选项 (IUO) 始终具有相同的含义。它们是可选值,但是每当访问它们时,它们将被强制解包以提供非可选值(实际上这在 Swift 4.2 中有所改变,现在它们仅在需要非可选值时才被强制解包,否则它们没有打开)。如果将函数输入参数声明为 IUO,则无论何时使用它都会在函数内部强制解包,但您仍然可以传入一个可选参数。这是否有一个真正的用例是一个不同的问题(我会说不)。
标签: ios swift completion-block